Haril Song
2021. 6. 17. 20:00
1002번: 터렛
각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.
www.acmicpc.net
🤔생각해보기
피타고라스 정리
를 활용하여 원의 교점을 구하는 문제다.
생각보다 고려해야할 조건이 많아서 성공할거라고 확신했음에도 7번 정도 실패했다...
하나씩 조건을 해결해가면 금방 풀 수 있는 문제이니 한 번 정리해보자.
우선 distance = 두 터렛 간의 거리 를 구해야 한다.
- 거리(distance)가 0 보다 커야 두 터렛이 같은 위치가 아니므로 아래 조건(2~4)을 적용한다.
- 만약 두 터렛이 각자 계산한 거리 r1, r2, 그리고 distance 중 가장 긴 값이 나머지 두 값의 합보다 크다면 만나지 않는다.
- distance = r1 + r2 라면 외접이며 1 곳에서 만난다.
- distance, r1, r2 중 가장 큰 값이 나머지 두 값의 합과 같다면 내접으로 1곳에서 만난다.
- distance가 0 이라면 두 터렛은 같은 위치에 있으므로 r1 == r2 라면 무한한 접점이 생긴다. -1 을 출력한다.
- distance가 0일 때 r1 ≠ r2 라면, 접점이 생기지 않는다.
import math
import sys
T = int(sys.stdin.readline())
for _ in range(T):
x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().split())
# 두 터렛 간의 거리(distance)
c = (abs(x2 - x1) ** 2) + (abs(y2 - y1) ** 2)
distance = math.sqrt(c)
# 거리가 0보다 커야 같은 위치가 아니다.
# 외접, 내접을 고려해야한다.
r = sorted([distance, r1, r2])
if distance > 0:
# 외접
if distance == r1 + r2:
print(1)
# 내접
elif r[-1] == r[0] + r[1]:
print(1)
# 가장 긴 값이 나머지 합보다 클 경우 만나지 않는다.
elif r[-1] > r[0] + r[1]:
print(0)
else:
print(2)
else:
if r1 == r2:
print(-1)
else:
print(0)