백준 1002번 - 터렛

@ckdhkdwns · April 27, 2023 · 3 min read

풀이

먼저, 문제는 두 원의 중심 좌표와 반지름이 주어졌을 때, 겹치는 점의 개수를 찾는 것입니다. 겹치는 점의 개수는 다음과 같은 경우가 있습니다.

  1. 두 원이 서로 겹치지 않는 경우 (겹치는 점이 없음): 0
  2. 두 원이 서로 한 점에서 만나는 경우 (외접 또는 내접): 1
  3. 두 원이 서로 두 점에서 만나는 경우: 2
  4. 두 원이 완전히 겹쳐져 있는 경우 (겹치는 점이 무한대): -1

get_cross_count(x1, y1, r1, x2, y2, r2)

이 함수는 두 원의 겹치는 점의 개수를 반환하는 함수입니다.

먼저, 두 원의 중심 사이의 거리를 계산합니다. 거리는 유클리디안 거리 공식인 (x2x1)2+(y2y1)2\sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}를 사용하여 계산됩니다.

그 다음, 두 원이 겹치는 경우를 판단합니다.

  • 두 원의 중심 좌표가 같고 (거리가 0이고), 반지름도 같다면, 두 원은 완전히 겹쳐져 있으므로 겹치는 점의 개수는 무한대를 의미하는 -1을 반환합니다.
  • 두 원의 중심 거리가 r1+r2r_1 + r_2와 같다면 두 원이 서로 외접하므로 겹치는 점의 개수는 1입니다.
  • 두 원의 중심 거리가 r2r1r_2 - r_1와 같다면, 두 원이 서로 내접하므로 겹치는 점의 개수는 1입니다.
  • 두 원의 중심 거리가 r1+r2r_1 + r_2보다 작고, r2r1r_2 - r_1보다 크다면, 두 원이 서로 두 점에서 만나므로 겹치는 점의 개수는 2입니다.
  • 위의 경우가 아닌 경우에는 두 원이 겹치지 않으므로 겹치는 점의 개수는 0입니다.

단, 문제에서는 중심 사이의 거리를 비교하기만 하므로 계산할 때 \sqrt{}(루트)를 사용하지 않았습니다.

import sys

def get_cross_count(x1, y1, r1, x2, y2, r2):
  distance = (x2 - x1)**2 + (y2 - y1)**2

  if distance == 0 and r1 == r2:
      return -1
  elif distance == (r1 + r2)**2 or distance == (r2 - r1) ** 2:
    return 1
  elif distance < (r1 + r2)**2 and distance > (r2 - r1) ** 2:
    return 2
  else:
    return 0

t = int(sys.stdin.readline())
results = []
for i in range(t):
  x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().split())
  results.append(get_cross_count(x1, y1, r1, x2, y2, r2))

for i in results:
  print(i)
@ckdhkdwns
developer blog