백준 1002번 풀이

문제

두 원의 교점 개수를 구하는 문제. 참고로 문제에 나오는 터렛 이미지는 스1에 있는 미사일 터렛이다. (테란 건물임) 어떻게 알긴… 스타는 민속놀이 아님?

풀이

사실 이 문제는 두 원의 교점이 2, 1, 0, 무한대일 때에 대한 케이스를 로직으로 처리하면 되는 매우 개 심플한 문제다. 근데 케이스 여섯개임. 2, 1, 0, 무한대면 네 개 아니냐고? 1이랑 0이 케이스 두개씩 끼고 간다. 논리게이트의 X시리즈(XOR, XNOR)가 식 두개인거랑 비슷함.

그럼 각 케이스별로 알아보기 전에… 원의 교점 개수를 판별하기 위해서는 두 원의 중점간 거리와 반지름 정보가 필요하다. 그래서 입력이 XY좌표랑 반지름인 것. 그럼 어떻게 거리를 구하냐고? 저거 유클리드 거리라 구하는 거 쉽다.

여기다 대입하면 된다. 반지름은 r1+r2(합)와 |r1-r2|(차의 절대값) 두 개가 필요하다.

케이스 스터디

  1. 교점이 무한대: d = 0, r1 = r2
  2. 교점 없음: d > r1+r2 or d < |r1-r2|
  3. 교점이 하나: d = r1+r2 or d = |r1-r2| (앞에껀 외접 뒤에껀 내접)
  4. 교점이 둘: |r1-r2| < d < r1+r2

자 이제 IDE 켜자.

코드

import math
import sys
T = int(sys.stdin.readline())
for i in range(T):
  x1,y1,r1,x2,y2,r2 = map(int,sys.stdin.readline().split())
  d = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
  sum_r = r2 + r1
  min_r = abs(r1 - r2)
  if d == 0 and r1 == r2:
    print(-1)
  elif d > sum_r:
    print(0)
  elif d < min_r:
    print(0)
  elif d == sum_r:
    print(1)
  elif d == min_r:
    print(1)
  else: 
    print(2)

sqrt()는 math 모듈이 필요하니 혹시 모듈 부르기 번거롭다면 0.5제곱 하자. (걍 루트=0.5제곱)