BOJ

[Python 3] BOJ - 1002 "터렛"

PeiSea 2020. 4. 7. 21:56

 # 문제 링크 : https://www.acmicpc.net/problem/1002

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

 

 # 풀이 :

개인적으로 이 문제의 핵심은 두 원의 관계를 묻는 것이라 생각한다. 터렛과 마린의 거리는 반지름이므로, 원이 접하는 경우에 따라 류재명의 가능한 좌표의 갯수가 달라진다. 

<그림 1. 가능한 경우의 수>

위 그림 1에서 1번 경우, 2번 경우는 한 점에서 만나므로 답이 1이고, 4번 경우는 모든 점에서 만나므로 답은 -1, 3번 경우는 만나지 않으므로 답은 0이 된다. 두 원의 중심간의 거리와 각각의 반지름의 관계를 통해 어떤 경우에 해당하는 알 수 있다. 

 

 # 코드

import sys, math

b = int(sys.stdin.readline())
for i in range(b):
    a = list(map(int, sys.stdin.readline().split()))
    
    # 중심 간 거리 계산
    r1 = [a[0], a[1]]
    r2 = [a[3], a[4]]
    center_distance = math.sqrt((r1[0] - r2[0]) ** 2 + (r1[1] - r2[1]) ** 2)
    
    # 반지름 거리 계산
    m = [a[2], a[-1]]
    
    # 1. 한점에서 만나는 경우
    if center_distance != 0 and center_distance == m[0] + m[1]:
        print(1)
    elif center_distance != 0 and center_distance == (max(m) - min(m)):
        print(1)
        
    # 2. 두점에서 만나는 경우
    elif center_distance != 0 and (max(m) - min(m) < center_distance < m[0] + m[1]):
        print(2)
        
    # 3. 아예 원이 같은 경우
    elif center_distance == 0 and m[0] == m[1]:
        print(-1)
        
    # 4. 아예 안만나는 경우
    else:
        print(0)