[이 문제의 핵심]
== 을 사용할 때는 주의하자! 컴퓨터는 모든 실수를 정확하게 저장하지 않는다.
import math
T = int(input())
for _ in range(T):
x1, y1, r1, x2, y2, r2 = map(int, input().split())
if (x1 == x2 and y1 == y2 and r1 == r2): # 같은 좌표에서 같은 반지름이면 원이 겹친다.
print(-1)
continue
if (r2 > r1): # r2는 항상 r1보다 작게끔 한다.
(x1, y1, r1, x2, y2, r2) = (x2, y2, r2, x1, y1, r1)
경우의 수를 쉽게 생각하기 위해, 두 번째 좌표의 반지름 r2는 r1보다 무조건 작도록 하였다.
xy_distance_pow = (x1 - x2) ** 2 + (y1 - y2) ** 2
xy_distance = math.sqrt(xy_distance_pow)
중요한 대목이다.
xy_distance_pow는 int로 남아있도록 루트를 계산하지 않았다.
이는 전에 설명했다시피 등호(==)를 사용할 때, 실수 값끼리 비교하지 않게 하기 위해서이다.
if (xy_distance_pow == r1 ** 2): # 점 2가 점 1의 원 경계에 위치할 때
print(2)
continue
elif (xy_distance_pow < r1 ** 2): # 점 2가 점 1의 원 안에 위치할 때
if (xy_distance + r2 < r1): # 점 2의 원이 점 1의 원에 못 미칠때
print(0)
continue
elif (xy_distance + r2 > r1): # 점 2의 원이 점 1의 원을 넘을 때
print(2)
continue
else: # 점 2의 원이 딱 점 1의 원과 내접할 때
print(1)
continue
else: # 점 2가 점 1의 원 밖에 위치할 때
if (xy_distance > (r1 + r2)): # 두 원이 서로 닿지 않으면
print(0)
continue
elif (xy_distance < (r1 + r2)): # 두 점 사이의 거리보다 두 반지름의 합이 크면
print(2)
continue
else: # 두 점사이의 거리가 두 반지름의 합과 같다면
print(1) # 1개 겹친다.
continue
나머지 코드는 가능한 경우에 맞게 생각하면 된다.
- 두 원이 일치할 때, 답은 -1
- 두 원이 외접할 때, 답은 1
- 두 원이 내접할 때, 답은 1
- 두 원이 서로 떨어져 있고 만나지 않을 때, 답은 0
- 한 원이 다른 원의 내부에 있고 두 원이 만나지 않을 때, 답은 0
- 나머지의 경우, 답은 2
https://www.acmicpc.net/problem/1002
'알고리즘과 코딩 테스트 > 백준 25단계' 카테고리의 다른 글
[파이썬] 2004번. 조합 0의 개수 풀이 (0) | 2023.02.24 |
---|---|
[파이썬] 9375번. 패션왕 신해빈 풀이 (0) | 2023.02.22 |
[파이썬] 2981번. 검문 풀이 (1) | 2023.02.21 |
[파이썬] 2477번. 참외밭 풀이 (0) | 2023.02.13 |
[파이썬] 3009번. 네 번째 점 풀이 (0) | 2023.02.12 |