백준 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)