본문 바로가기
Algorithm/etc

[파이썬] 백준 7869 : 두 원 (골드2)

by 베짱이28호 2023. 5. 17.

[파이썬] 백준 7869 : 두 원 (골드2)

 

 

7869번: 두 원

첫째 줄에 두 원의 중심과 반지름 x1, y1, r1, x2, y2, r2가 주어진다. 실수는 최대 소수점 둘째자리까지 주어진다.

www.acmicpc.net


문제


풀이

0. 방향성 생각

그냥 풀려고 하면 조건문 걸 때 조금 복잡해지는듯 해서 생각하기 쉽게 원점, x축 위로 중심을 옮긴다.

공통 영역의 넓이를 구하려고 그림을 그려보면 알겠지만 그냥 피타고라스를 통해 풀려고 하면 연립방정식에서 부호가 달라져서 케이스를 더 나눠야한다.

$$c^2 = a^2 + b^2 - 2abcosC$$

제2코사인 써서 각도 얻기. 이렇게 얻으면 예각 둔각을 나눌필요 없다. (sin (0,pi)에서 양수)

 

1.  입력 받기, 축 변환

import math
x1,y1,r1,x2,y2,r2 = map(float,input().split())
if r1 < r2 :
    x1,y1,r1,x2,y2,r2 = x2,y2,r2,x1,y1,r1

d = math.sqrt((x2-x1)**2+(y2-y1)**2)
x2,y2 = d,0
x1,y1 = 0,0

큰 원의 값들을 x1,y1,r1으로 할당해주고 좌표를 바꿔준다.

2. 중심각,넓이 구하기, 출력

if r1 <= x2-r2:
    answer = 0
    print(f'{answer:.3f}')
    
elif x2+r2 <= r1:
    answer = math.pi*(r2**2)
    print(f'{answer:.3f}')

else :
    ang1 = 2*math.acos((r1**2+d**2-r2**2)/(2*r1*d))
    ang2 = 2*math.acos((r2**2+d**2-r1**2)/(2*r2*d))
    answer = 0.5*((r1**2)*(ang1-math.sin(ang1))+ (r2**2)*(ang2-math.sin(ang2)))
    print(f'{answer:.3f}')

축 변환해서 그림그리면 조건문이 바로 보인다.

답은 호의 넓이 - 삼각형의 넓이로 구한다.

$$ answer = 1/2 * r^2 * ( angle - sin(angle) )$$


전체 코드

import math
x1,y1,r1,x2,y2,r2 = map(float,input().split())
if r1 < r2 :
    x1,y1,r1,x2,y2,r2 = x2,y2,r2,x1,y1,r1

d = math.sqrt((x2-x1)**2+(y2-y1)**2)
x2,y2 = d,0
x1,y1 = 0,0

if r1 <= x2-r2:
    answer = 0
    print(f'{answer:.3f}')
    
elif x2+r2 <= r1:
    answer = math.pi*(r2**2)
    print(f'{answer:.3f}')

else :
    ang1 = 2*math.acos((r1**2+d**2-r2**2)/(2*r1*d))
    ang2 = 2*math.acos((r2**2+d**2-r1**2)/(2*r2*d))
    answer = 0.5*((r1**2)*(ang1-math.sin(ang1))+ (r2**2)*(ang2-math.sin(ang2)))
    print(f'{answer:.3f}')

 

리빙 포인트 :

print(0.000)
0

다음 출력은 0이다.

댓글