티스토리 뷰
[Python] 백준 알고리즘 온라인 저지 1002번 : 터렛
Python3 코드
import math
n = int(input())
for _ in range(n):
x1, y1, r1, x2, y2, r2 = map(int, input().split())
distance = math.sqrt((x1-x2)**2 + (y1-y2)**2) # 두 원의 거리 (원의방정식활용)
if distance == 0 and r1 == r2 : # 두 원이 동심원이고 반지름이 같을 때
print(-1)
elif abs(r1-r2) == distance or r1 + r2 == distance: # 내접, 외접일 때
print(1)
elif abs(r1-r2) < distance < (r1+r2) : # 두 원이 서로다른 두 점에서 만날 때
print(2)
else:
print(0) # 그 외에
Python3 코드 풀이
1. 작성한 코드에 대한 전체적인 풀이 내용
이 문제는 두 개의 터렛 각각에서 상대편 마린(타깃)까지의 거리가 주어졌을 때, 타깃이 위치할 수 있는 경우의 수를 출력하는 문제이다. 이 문제를 풀 때 두 원의 위치 관계를 이용해서 풀었다. 각 터렛에서 타깃까지의 거리를 토대로 타깃이 위치할 수 있는 점을 조합하면 각 터렛을 중심으로 한 두 개의 원을 그릴 수가 있기 때문이다. 두 원의 위치 관계를 이용하기 위해선 두 투렛의 거리가 필요하다. 이 두 터렛의 거리는 원의 방정식을 이용해서 풀었다.
2. 원의 방정식을 이용하여 두 터렛의 거리를 구하기
x1, y1, r1, x2, y2, r2 = map(int, input().split())
distance = math.sqrt((x1-x2)**2 + (y1-y2)**2) # 두 원의 거리 (원의방정식활용)
터렛 두 개의 좌표(x, y)와 터렛과 타깃까지의 거리 (r)를 입력받고서 x1, y1, r1, x2, y2, r2 변수에 선언한다.
두 터렛의 위치가 (x, y) 좌표로 각각 주어지기 때문에 두 터렛의 거리를 반지름으로 하는 원이 있다고 가정하고서 원의 방정식을 활용해서 두 터렛의 거리를 구했다.
원의 방정식 <출처: 네이버 지식백과>
3. 중심거리와 두 원의 위치 관계식을 이용하여 두 원의 접점 개수를 알아낸다.
if distance == 0 and r1 == r2 : # 두 원이 동심원이고 반지름이 같을 때
print(-1)
elif abs(r1-r2) == distance or r1 + r2 == distance: # 내접, 외접일 때
print(1)
elif abs(r1-r2) < distance < (r1+r2) : # 두 원이 서로다른 두 점에서 만날 때
print(2)
else:
print(0) # 그 외에
각 터렛에서 도출되는 두 원의 접점은 중심거리와 두 원의 위치 관계식을 조건문으로 표현하였다. 위치 관계식을 그대로 보는 게 좋을 것 같아서 중복되는 문장은 단축하지 않았다.
4. 중심거리와 두 원의 위치 관계 <출처: 네이버 지식백과>
반지름의 길이가 r1인 원과 r2인 원의 중심거리를 d라고 할 때, |r1 - r2| 또는 r1 + r2와의 크기를 비교하면, 두 원의 위치 관계를 알 수 있다.
r1 + r2 < d 이면 두 원은 서로의 외부에 위치한다.
r1 + r2 = d 이면 두 원은 외접한다.
|r1 - r2| < d < r1 + r2 이면 두 원은 서로 다른 두 점에서 만난다.
|r1 - r2| = d 이면 한 원이 다른 원에 내접한다.
|r1 - r2| > d, r1 ≠ r2 이면 한 원이 다른 원의 내부에 있다.
'파이썬 스킬업 > 백준 알고리즘 연습' 카테고리의 다른 글
백준 10872 [파이썬] 팩토리얼 (=계승) (1) | 2020.07.24 |
---|---|
백준 3053 [파이썬] 택시기하학 : 원의 넓이 공식 (0) | 2020.07.22 |
백준 4153 [파이썬] 직각삼각형 : 피타고라스의 정리 (0) | 2020.07.21 |