728x90


문제가 짧지 않아 복잡해 보이는 문제이지만 두 개의 원의 교점 개수를 구하는 문제이다.
두 정점 사이의 거리를 구하고 두 원의 반지름을 통해 교점 개수를 구할 수 있었다.
1. 두 원점이 같을 경우
import math as m
N = int(input())
for _ in range(N):
x1, y1, ar, x2, y2, br = map(int, input().split())
# 정점이 같을 경우
if x1 == x2 and y1 == y2:
if ar == br:
print(-1)
else:
print(0)

이러한 모양은 접점이 없으므로 0 출력
사진은 없지만 반지름 길이도 같아 하나의 원처럼 보이는 경우 접점이 무수히 많으므로 -1 출력
2. 두 정점의 위치가 서로 다를 경우 ( 외접하거나 떨어져있거나 )
else:
#두 점 사이의 거리 (피타고라스 정리)
distance = m.sqrt((x2-x1)**2 + (y2-y1)**2)
# 두 원의 반지름 길이와 거리가 같으면 교점이 하나
if distance == ar + br:
print(1)
# 두 원의 반지름 길이가 두 점 사이의 거리보다 짧다면
# 서로 완전히 떨어져 있으므로 교점이 없음
elif distance > ar + br:
print(0)
먼저 두 점 사이의 거리를 구합니다.
조건문 순서대로 다음과 같을 때입니다.


2. 두 정점의 위치가 서로 다를 경우 ( 내접 )
# 원이 내접할 때 교점 1개 ( 아래 그림의 3번 그림 )
elif distance == abs(ar - br):
print(1)
# 큰 원에 내접하지 않을 때 0개 ( 아래 그림의 6번 그림 )
elif distance < abs(ar - br):
print(0)
# 그 외 1번 그림
else: print(2)



실수
처음에는 위의 코드와 살짝 다르게 제출했을 때 틀렸습니다가 나왔다. 질문 검색을 해봤을 때 웬만한 반례들을 실행시켜도 전부 정답이 나왔는데 힌트를 보고 깨달았다.
R을 int 단위로 버림한 다음에 R == r1 + r2인지 검사해도 안 됩니다. 버림하는 순간 더 이상 거리가 아닙니다.
여기서 R은 위 코드의 distance에 해당한다.
처음에는 무슨말이지 싶었는데 처음에 두 점 사이의 거리를 구할 때 나온 결과를 정수로 바꿔버린 것이다.
distance = round(m.sqrt((x2-x1)**2 + (y2-y1)**2))
두 원점 사이의 거리가 2√2일 때 거리를 그냥 2로 바꿔버려 두 점 사이의 거리가 더 짧아져버려 원래 떨어져서 0이 나와야 될것이 1로 나왔었다.
ex) 정점 (0,0) 반지름이 1, 정점 (3, 3) 반지름이 3일 때 두 점사이의 거리는 4.2426.....
하지만 거리의 소수점을 버려버려 원래 접점이 없어야 하지만 1을 출력하는 오류 발생
728x90
'알고리즘' 카테고리의 다른 글
| 백준 C++, PYTHON - 예산 (이진 탐색) (0) | 2023.03.29 |
|---|---|
| 백준 c++ - 치킨 배달 (브루트포스 알고리즘) (0) | 2023.03.29 |
| C++ - Greedy algorithm ( 헛간 고치기 ) (0) | 2023.02.09 |
| C++ - 큐, 너비 우선 탐색 (도망간 소 잡기) (0) | 2023.02.09 |
| 백준 C++ - 스택, 괄호 (9012) (0) | 2023.02.09 |