-
[백준 1002] 터렛 - Python3알고리즘 문제 풀이/BOJ 2021. 1. 23. 21:49
[백준 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
'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
[백준 1018] 체스판 다시 칠하기 - Python3 (0) 2021.02.15 [백준 2231] 분해합 - Python3 (0) 2021.02.08 [백준 11653] 소인수분해 - Python3 (0) 2021.01.17 [백준 9506] 약수들의 합 - Python3 (0) 2021.01.10 [백준 1920] 수 찾기 (이진 탐색) - Python3 (0) 2021.01.03