공부/알고리즘

[단계별로 풀어보기][python 3] 기본 수학2 - 터렛 (1002)

도리암 2022. 4. 26. 22:49

1002번: 터렛 (acmicpc.net)

 

1002번: 터렛

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

www.acmicpc.net

답안

두 원이 내접하는지, 외접하는지를 구분하고 그에 따라 반지름의 차이를 구하면 쉽게 구할 수 있다.

1. 동심원

동심원의 경우 r1과 r2가 같으면 모든 점에서 만나므로 -1을 반환한다.

2. 내접

r1-r2는 항상 d보다 같거나 크게 된다.

만약 두 반지름의 길이의 차이(r1-r2)가 두 원의 거리(d)의 절대값보다 작다면, 두 원은 2개의 점에서 교차한다.

만약 r1-r2가 d와 같다면 한 점에서 만나고, 그 이하면 만나지 않는다.

3. 외접

r1-r2는 항상 d보다 작게 된다.

r1+r2가 d보다 크게 되면 원은 두 점에서 만나고

r1+r2가 d와 같으면 한 점에서 만나며

r1+r2가 d보다 작으면 만나지 않는다.

from math import *
t = int(input())
result = []
for i in range(t):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())

    d = sqrt((x1-x2)**2 + (y1-y2)**2)
    R = r1 + r2
    
    if (x1 == x2) and (y1 == y2) and (r1 == r2):
        result.append(-1)
    else:
        if (r1-r2)**2 > d**2:
            result.append(0)
        elif (r1-r2)**2 == d**2:
            result.append(1)
        else:
            if d < R:
                result.append(2)
            elif d == R:
                result.append(1)
            else:
                result.append(0)
    
for i in result:
    print(i)