[BOJ, 백준] 7869 두 원

2024. 7. 26. 22:42Algorithm

 

 

 

중요한 것은 소수점 셋째자리까지 출력하는 것이겠다.

 

예를 들어, 0이라면 0.000으로 출력하는 것인데 이 부분에 대해서는 문자열로 출력해주기로 했다.

 

두 원의 위치 관계에 대해서는 중심 사이의 거리와 반지름을 활용하면 되겠다.

 

import math
x_1,y_1,r_1,x_2,y_2,r_2 = map(float,input().split())

#일반적으로 r1이 r2보다 더 길거나 같다고 가정하자.
if r_1 < r_2:
    new_x, new_y, new_r = x_1,y_1,r_1
    x_1,y_1,r_1 = x_2,y_2,r_2
    x_2,y_2,r_2 = new_x, new_y, new_r

d = math.sqrt((x_2 - x_1) ** 2 + (y_2 - y_1) ** 2)
r_sum = (r_1 + r_2) ** 2
r_diff = (r_1 - r_2) ** 2


#한점에서도 만나지도 않고 아예 외부에 존재하는 경우, 외부의 한점에서 만나는 경우
if r_sum <= d ** 2:
    answer = "0.000"
    print(answer)

#두 원중 작은쪽의 원이 내접, 포함하고 있는 경우
elif r_diff >= d ** 2:
    answer = math.pi * (r_2 ** 2)
    print(round(answer, 3))

#그 외의 경우
else:
    theta_1 = 2 * math.acos((r_1 ** 2 + d ** 2 - r_2 ** 2) / (2 * r_1 * d))
    theta_2 = 2 * math.acos((r_2 ** 2 + d ** 2 - r_1 ** 2) / (2 * r_2 * d))
    answer = (r_1 ** 2) * (theta_1 - math.sin(theta_1)) / 2 + (r_2 ** 2) * (theta_2 - math.sin(theta_2)) / 2
    print(round(answer, 3))