백준 7869 - 두 원 (파이썬)

Updated:

문제가 너무 어려워 다른 분들의 풀이를 참고했습니다.

두 원의 겹치는 부분의 부채꼴을 더하고 삼각형 넓이를 빼주면 구할 수 있습니다.
부채꼴의 각은 제 2 코싸인 법칙을 사용하여 구했습니다.

import math
import sys

input = sys.stdin.readline

x1, y1, r1, x2, y2, r2 = map(float, input().split())

def solve(x1, y1, r1, x2, y2, r2):
    d = math.sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2))
    rr1 = r1 * r1
    rr2 = r2 * r2
    
    if (d > r2 + r1):
        return 0
    elif (d <= abs(r1 - r2) and r1 < r2):
        return math.pi * rr1
    elif (d <= abs(r1 - r2) and r1 >= r2):
        return math.pi * rr2
    else:
        theta1 = (math.acos((rr1 + (d * d) - rr2) / (2 * r1 * d))) * 2
        theta2 = (math.acos((rr2 + (d * d) - rr1) / (2 * r2 * d))) * 2
        area1 = 0.5 * rr2 * (theta1 - math.sin(theta1))
        area2 = 0.5 * rr1 * (theta2 - math.sin(theta2))
        
        return area1 + area2
    
result = float(round(1000 * solve(x1, y1, r1, x2, y2, r2)) / 1000)
print('%.3f' % result)

Categories:

Updated: