백준 1002 터렛 solution[python, 파이썬] - 풀이, 설명::FBTT
https://www.acmicpc.net/problem/1002
1002번: 터렛
각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.
www.acmicpc.net
- 좌표(x1, y1, x2, y2)와 거리(r1, r2)로부터 원의 중심과 반지름을 떠올린다.
- 두 개의 원이 동시에 지나는 점(접점)의 개수를 생각해본다.
접점은 최대 2개가 될 수 있다.
접점이 3개가 될 경우는 존재하지 않고 두 원이 같은 경우 접점이 무한대가 되기 때문에 -1을 출력한다
두 원의 중심의 거리를 구할 때는 제곱근을 사용하지 않는다.
python의 math 모듈에 있는 sqrt()는 근삿값을 구하기 때문에 오차를 없애기 위해 반지름도 제곱하는 형태로 조건문을 짰다
가장 쉬운 접점이 2개가 되는 경우는 (두 원의 중심의 거리) ** 2 < (r1 + r2) ** 2 이다.
접점이 1개인 경우는 2가지가 있다.
바깥에서 만나는 경우 (중심의 거리) ** 2 == (r1 + r2) ** 2
안에서 만나는 경우 (중심의 거리) ** 2 == (r1 - r2) ** 2
이 두 가지 경우이다.
접점이 없는 경우도 2가지가 있다.
서로 다른 두 원이 바깥에서 만나지 않는 경우 (중심의 거리) ** 2 > (r1 + r2) ** 2
한 원이 다른 원안에 있으면서 만나지 않는 경우 (중심의 거리) ** 2 < (r1 - r2) ** 2
마지막으로 두 원이 중심과 반지름이 같아 접점의 개수가 무한대인 경우이다.
(중심의 거리) == 0 and r1 == r2
1
2
3
4
5
6
7
8
9
10
11
12
|
T = int(input())
for i in range(T):
x1, y1, r1, x2, y2, r2 = map(int, input().split())
dis = (x2 - x1) ** 2 + (y2 - y1) ** 2
if dis == 0 and r1 == r2:
print(-1)
elif dis == (r1 + r2) ** 2 or dis == (r1 - r2) ** 2:
print(1)
elif dis > (r1 + r2) ** 2 or dis < (r1 - r2) ** 2:
print(0)
elif dis < (r1 + r2) ** 2:
print(2)
|
cs |