문제
두 원의 교점 개수를 구하는 문제. 참고로 문제에 나오는 터렛 이미지는 스1에 있는 미사일 터렛이다. (테란 건물임) 어떻게 알긴… 스타는 민속놀이 아님?
풀이
사실 이 문제는 두 원의 교점이 2, 1, 0, 무한대일 때에 대한 케이스를 로직으로 처리하면 되는 매우 개 심플한 문제다. 근데 케이스 여섯개임. 2, 1, 0, 무한대면 네 개 아니냐고? 1이랑 0이 케이스 두개씩 끼고 간다. 논리게이트의 X시리즈(XOR, XNOR)가 식 두개인거랑 비슷함.
그럼 각 케이스별로 알아보기 전에… 원의 교점 개수를 판별하기 위해서는 두 원의 중점간 거리와 반지름 정보가 필요하다. 그래서 입력이 XY좌표랑 반지름인 것. 그럼 어떻게 거리를 구하냐고? 저거 유클리드 거리라 구하는 거 쉽다.
여기다 대입하면 된다. 반지름은 r1+r2(합)와 |r1-r2|(차의 절대값) 두 개가 필요하다.
케이스 스터디
- 교점이 무한대: d = 0, r1 = r2
- 교점 없음: d > r1+r2 or d < |r1-r2|
- 교점이 하나: d = r1+r2 or d = |r1-r2| (앞에껀 외접 뒤에껀 내접)
- 교점이 둘: |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제곱)
Reply