[백준 1002] 터렛 - Python3
[백준 1002] 터렛 - Python3
<문제>
- 두 좌표( [x1,y1], [x2,y2] ) 와 각 좌표에서 목표까지 떨어진 거리(r1, r2)가 주어졌을 때 목표가 존재할 수 있는 좌표의 개수를 출력하는 문제다.
<입력>
첫째 줄 : 테이스케이스 개수
한 줄에 x1, y1, r1, x2, y2, r2가 주어진다.
<출력>
주어진 좌표를 통해 목표가 존재할 수 있는 좌표의 개수를 출력한다. (무한대라면 -1을 출력)
<풀이>
(1)
처음엔 읽어보고 무슨 소리인가 싶었는데 문자를 차츰 하나씩 뜯어보면서 다시 생각해봤다.
'한 점(x1, y1)에서 r1만큼 떨어져 있다.'라는 문장을 보니 어쩐지 원이랑 연결될 것 같았다.
따라서 각 점과 거리를 기준으로 원을 그리고, 이 원들이 만나는 경우의 수를 생각해서 풀면 될 것 같았다.
그래서 경우의 수를 생각하고 손으로 그려보았다. (발로 그림 주의...)
여기서 d는 두 점([x1,y1], [x2,y2]) 사이의 거리이다.
(1) 두 점이 만날 때
(a) 두 거리(r1,r2) 가 같을 때
=> 동일한 원이다. 점의 개수는 무한대
(b) 두 거리가 다를 때
=> 원이 포함관계이다. 접점이 없다.
(2) 두 점이 다를 때
(a) 두 점 사이 거리가 각 점에서의 거리보다 클 때
=> 두 원의 거리가 멀어서 접점이 없다.
(b) 한 점에서의 거리가 나머지 점에서의 거리와 두 점 사이의 거리의 합보다 클 때
=> 원이 포함관계이기에 접점이 없다.
(c) 한 점에서의 거리가 나머지 점에서의 거리와 두 점 사이의 합과 같을 때
=> 한 원이 다른 원에 내접한다. 접점은 1개다.
(d) 두 점 사이의 거리와 각 점에서의 거리의 합이 같을 때
=> 두 원은 서로 외접한다. 접점은 1개다.
(e) 두 원이 겹칠 때
=> 마지막 경우로 원이 서로 교집합을 형성한다면 접점은 2개다.
대충 이런 식으로 나뉜다. 이젠 이걸 코드로 옮기면 다음과 같다.
T=int(input())
for _ in range(T):
x1,y1,r1,x2,y2,r2 = map(int,input().split())
d = ((x1-x2)**2 + (y1-y2)**2) ** 0.5
if x1==x2 and y1==y2:
if r1==r2:
print(-1)
else:
print(0)
continue
if r1 > d+r2 or r2 > d+r1 or d > r1+r2:
print(0)
elif r1==d+r2 or r2 == d+r1 or r1+r2 == d:
print(1)
else:
print(2)
수학적인 문제라서 직접 그리면서 상황을 맞춰보니 쉽게 풀린 것 같다. 무작정 코딩하는 것보다 미리 생각해서 써보면서 하는 습관을 들이라는 교수님들의 말이 와 닿는다... 지금까진 수학적인 문제여도 일단은 코딩부터 하고 봤는데, 이러니까 시간이 더 단축되는 것 같다.
<풀이 인증>
문제 출처 : www.acmicpc.net/problem/1002