문제풀이/수학

[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

 

그림으로 살펴보면 다음과 같다.