728x90
문제에 익숙한 용어와 스타크래프트 그림이 있어서 풀어보고 싶었다.
처음에 문제를 읽었을 때, 두 좌표간 공통의 지점을 찾는 문제구나까지는 바로 인지했으나, 원의 접점을 구하는 문제라는 것을 깨닫기 까지는 아주 조금 더 걸렸던 것 같다. 즉, 두 원 사이에 접점의 개수를 구하면 되는 문제이다.
두 원이 접할 수 있는 경우의 수는 많지는 않다.
1) 두 원 사이에 겹치는 점이 2개일 때
2) 두 원 사이에 겹치는 점이 없을 때
3) 두 원 사이에 겹치는 점이 1개일 때
그리고 3번은 다시 2가지 경우로 나뉜다.
1) 외접의 경우
2) 내접의 경우
외접의 경우는 8을 생각하면 될 것이고, 내접의 경우는 @정도가 적당할 것 같다. 물론 완벽한 예시들은 아니지만, 글자로 표시하기에는 이 정도면 충분해보인다. 그림 자료를 구해와서 붙여넣는 것은 일이 더 생기는 거니까..
원의 접점을 구하는 법은 공식으로 나와있다.
두 원의 중심점 사이의 거리를 구하고, 이를 두 원의 반지름을 더하거나 빼서 비교해주면 된다.
코드는 아래와 같다.
import sys, math
# 1002 터렛
T = int(input())
for i in range(T):
x1, y1, z1, x2, y2, z2 = map(int, sys.stdin.readline().split())
# 두 원의 거리 계산
d = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
# case에 따른 접점 개수
# 1) 두 원이 동일할 때
if d == 0 and z1 == z2:
print(-1)
# 2) 두 원이 내접하거나, 외접하여 접점이 1개일 때
elif (d == z1 + z2) or (d == abs(z1 - z2)):
print(1)
# 3) 두 원의 접점이 2개일 때
elif abs(z1 - z2) < d < z1 + z2:
print(2)
# 4) 이 외에는 원의 접점이 존재하지 않음
else:
print(0)
이 문제를 풀면서 느낀점은 딱 한 가지다.
일부 수학 공식들은 외워두는 것이 알고리즘 풀이에 큰 도움이 되겠구나.
오랜만에 알고리즘 문제를 풀어보니 나름 재밌었던 것 같다. 종종 너무 어렵지 않은 문제들을 풀어보도록 다시 습관을 들여봐야겠다.
728x90
'알고리즘' 카테고리의 다른 글
[알고리즘] 계수정렬 (1) | 2025.04.27 |
---|---|
[백준] 1874 스택수열 (Python) (1) | 2024.09.01 |
[백준] 2941 크로아티아 알파벳 (Java) (0) | 2022.08.10 |
[백준] 1712 손익분기점 (Java) (0) | 2022.08.09 |
[백준] 2525 오븐시계 (Python) (0) | 2022.07.29 |