풀이
먼저, 문제는 두 원의 중심 좌표와 반지름이 주어졌을 때, 겹치는 점의 개수를 찾는 것입니다. 겹치는 점의 개수는 다음과 같은 경우가 있습니다.
- 두 원이 서로 겹치지 않는 경우 (겹치는 점이 없음): 0
- 두 원이 서로 한 점에서 만나는 경우 (외접 또는 내접): 1
- 두 원이 서로 두 점에서 만나는 경우: 2
- 두 원이 완전히 겹쳐져 있는 경우 (겹치는 점이 무한대): -1
get_cross_count(x1, y1, r1, x2, y2, r2)
이 함수는 두 원의 겹치는 점의 개수를 반환하는 함수입니다.
먼저, 두 원의 중심 사이의 거리를 계산합니다. 거리는 유클리디안 거리 공식인 를 사용하여 계산됩니다.
그 다음, 두 원이 겹치는 경우를 판단합니다.
- 두 원의 중심 좌표가 같고 (거리가 0이고), 반지름도 같다면, 두 원은 완전히 겹쳐져 있으므로 겹치는 점의 개수는 무한대를 의미하는 -1을 반환합니다.
- 두 원의 중심 거리가 와 같다면 두 원이 서로 외접하므로 겹치는 점의 개수는 1입니다.
- 두 원의 중심 거리가 와 같다면, 두 원이 서로 내접하므로 겹치는 점의 개수는 1입니다.
- 두 원의 중심 거리가 보다 작고, 보다 크다면, 두 원이 서로 두 점에서 만나므로 겹치는 점의 개수는 2입니다.
- 위의 경우가 아닌 경우에는 두 원이 겹치지 않으므로 겹치는 점의 개수는 0입니다.
단, 문제에서는 중심 사이의 거리를 비교하기만 하므로 계산할 때 (루트)를 사용하지 않았습니다.
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)