[파이썬] 백준 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이다.
'Algorithm > etc' 카테고리의 다른 글
[파이썬] 백준 3273 : 두 수의 합 (실버3) (0) | 2023.05.27 |
---|---|
[파이썬] 백준 10819 : 차이를 최대로 (실버) (0) | 2023.05.26 |
[파이썬] 백준 2559 : 수열 (실버3) (0) | 2023.05.24 |
[파이썬] 백준 2166 : 다각형의 면적 (골드5) (0) | 2023.05.16 |
[파이썬] 백준 1759: 암호만들기 (골드5) (0) | 2023.05.11 |
[파이썬] 백준 1411: 비슷한 단어 (실버2) (0) | 2023.05.08 |
[파이썬] 백준 - 15단계 약수,배수와 소수2 (0) | 2023.04.28 |
댓글