문제풀이/수학
[Python/파이썬] 백준 1002번 터렛
딜레이레이
2025. 4. 18. 23:58
https://www.acmicpc.net/problem/1002
코드
from math import sqrt
for _ in range(int(input())):
x1, y1, r1, x2, y2, r2 = map(int, input().split())
dist = sqrt((x1-x2)**2+(y1-y2)**2)
if dist == 0:
print(0 if r1 != r2 else -1)
elif dist < max(r1, r2):
if dist+min(r1, r2) < max(r1, r2):
print(0)
elif dist+min(r1, r2) == max(r1, r2):
print(1)
else:
print(2)
else:
if r1+r2 < dist:
print(0)
elif r1+r2 == dist:
print(1)
else:
print(2)
처음 봤을 때는 너무 쉽다고 생각했는데, 틀렸다....
다시 곰곰히 생각해보니 생각 못해준 조건들이 많았다. 처음에는 각 원의 중심이 다른 원의 영역 내에 포함되지 않는 경우만 고려했던 것이 잘못됐다. 그래서 어떤 경우가 있을 수 있는지 구해봤다.
여기서 `dist`는 두 원의 중심 간의 거리다.
1. 동심원(두 원의 중심이 같은 경우) (`dist == 0`)
1-1) 두 원의 반지름이 같은 경우: -1
1-2) 두 원의 반지름이 다른 경우: 0
2. 한 원의 중심이 다른 원의 내부에 있는 경우 (`dist < max(r1, r2)`)
2-1) 작은 원이 큰 원의 내부에 있는 경우: 0
2-2) 내접하는 경우(한 점에서 만나는 경우): 1
2-3) 두 원이 두 점에서 만나는 경우: 2
3. 각 원의 중심이 다른 원의 내부에 있지 않은 경우 (`dist > max(r1, r2)`)
3-1) 두 원이 만나지 않는 경우: 0
3-2) 외접하는 경우: 1
3-3) 두 원이 두 점에서 만나는 경우: 2
그림으로 살펴보면 다음과 같다.