백준 1002 파이썬


1. 문제

1002

2. 설명

원의 교점 개수를 구하는 문제다.

3. 풀이

원의 교점의 개수는 0개, 1개, 2개가 될 수 있는데 다음의 6가지 경우가 있다.

  1. 두 원이 완전히 동일한 경우 (무한대)
    • 반지름이 서로 같고, 원의 중심이 같다.
  2. 두 원이 외접하는 경우 (한 점에서 만남)
    • 두 원의 중심의 거리가 두 원의 반지름의 합과 같다.
  3. 두 원이 내접하는 경우 (한 점에서 만남)
    • 두 원의 중심의 거리가 반지름의 차와 같다
  4. 두 원이 두 점에서 만나는 경우
    • 두 원의 중심의 거리가 반지름의 차보다는 크고 반지름의 합보다는 짧다
  5. 두 원이 만나지 않는 경우 (외부에서 떨어져 있음)
    • 두 원의 중심의 거리가 두 원의 반지름의 합보다 크다
  6. 두 원이 만나지 않는 경우 (한 원이 다른 원 내부에 포함됨)
    • 두 원의 중심의 거리가 반지름의 차보다 짧다

이를 그림으로 표현하면 다음과 같다.

example

4. 코드

count = int(input())

for _ in range(count):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())

    distance = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5  # 두 원의 중심 거리

    # 두 원이 완전히 동일한 경우 (무한대)
    if distance == 0 and r1 == r2:
        print(-1)
    # 두 원이 외접하는 경우 (한 점에서 만남)
    elif distance == r1 + r2:
        print(1)
    # 두 원이 내접하는 경우 (한 점에서 만남)
    elif distance == abs(r1 - r2):
        print(1)
    # 두 원이 두 점에서 만나는 경우
    elif abs(r1 - r2) < distance < r1 + r2:
        print(2)
    # 두 원이 만나지 않는 경우 (외부에서 떨어져 있음)
    elif distance > r1 + r2:
        print(0)
    # 두 원이 만나지 않는 경우 (한 원이 다른 원 내부에 포함됨)
    elif distance < abs(r1 - r2):
        print(0)