[백준/파이썬] 1002번: 터렛

수박강아지·2025년 5월 28일

BAEKJOON

목록 보기
75/174

문제

https://www.acmicpc.net/problem/1002

풀이

  • 조규현의 좌표 (x1,y1)(x_1, y_1) 조규현이 계산한 류재명과의 거리 r1r_1
  • 백승환의 좌표 (x2,y2)(x_2, y_2) 백승환이 계산한 류재명과의 거리 r2r_2

한 명의 터렛 위치를 중심으로 하고 적 마린까지의 거리를 반지름으로 이루어진 원으로 설정하여 문제를 풀면 됩니다.

2개의 원이 주어지게 되는데 여기서 각 원의 교점의 개수를 구하면 문제를 풀 수 있습니다.

  1. 두 원의 중심이 같고 반지름이 같을 경우(같은 크기의 원) 무한대의 교점
  2. 외접 or 내접인 경우 1개의 교점
  3. 원이 서로 겹칠 경우는 2개의 교점
  4. 이 외의 상황들은 교점이 없으므로 0개의 교점

두 원의 중심 사이 거리를 구하여 원의 반지름을 서로 비교해 교점을 개수를 판별할 수 있습니다.
두 원의 중심 사이를 구하는 방법은 x축끼리의 차와 y축끼리의 차를 각각 제곱하여 더해준 후 루트를 씌우면 구할 수 있습니다.

	dis = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)

이제 이 길이를 갖고 교점의 개수를 판별하면 됩니다.
우선 두 원의 중심이 같고 반지름이 같을 경우 == 무한대

    if dis == 0 and r1 == r2:
        print(-1)

외접 or 내접인 경우 == 1개

    elif dis == r1 + r2 or dis == abs(r2 - r1):
        print(1)

서로 다른 두 점에서 만나는 경우 == 2개

    elif abs(r2 - r1) < dis < (r1 + r2):
        print(2)

두 원이 떨어지거나, 한 원이 다른 원 안에 있을 경우, 중심은 같지만 반지름이 다를 경우

    else:
        print(0)

코드

import sys, math
input = sys.stdin.readline

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

    dis = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
    
    if dis == 0 and r1 == r2:
        print(-1)
    elif dis == r1 + r2 or dis == abs(r2 - r1):
        print(1)
    elif abs(r2 - r1) < dis < (r1 + r2):
        print(2)
    else:
        print(0)

0개의 댓글