mirae.kwak 2022. 3. 16. 17:29
728x90

https://www.acmicpc.net/problem/1002

 

1002번: 터렛

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

www.acmicpc.net

 

Python3

import math
if __name__ == '__main__':
    n = int(input())
    for _ in range(n):
        x1, y1, r1, x2, y2, r2 = map(int, input().split())
        distance = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)

        if distance == 0 and r1 == r2:
            print(-1)
        elif abs(r1 - r2) == distance or r1 + r2 == distance:
            print(1)
        elif abs(r1 - r2) < distance < (r1 + r2):
            print(2)
        else:
            print(0)

두 좌표와 거리가 주어질 때 이를 다시 생각하면 두 원의 좌표와 반지름이 주어질 때 이 두 원이 몇개의 점에서 만나는지 구하는 문제이다. 따라서 원의 중심 좌표 2개를 받았을 때 이 두 원사이의 거리를 구하는 공식이 필요하다. 

원의 방정식 <출처: 네이버 지식백과>

다음과 같이 두 원 사이의 거리를 구할 수 있다. 이 거리와 두 원의 위치를 이용해 원의 접점의 개수를 구한다.

1. 두원이 동심원이고 반지름이 같을 때 = 접점의 개수가 무한대

2. 내접 또는 외접일 때 = 접점이 1개

3. 두 원이 서로 다른 두 점에서 만날 때 = 접점이 2개

4. 이외의 경우 = 접점이 0개

이 경우에 대해 코드를 작성한다.

 

if distance == 0 and r1 == r2:
    print(-1)
elif abs(r1 - r2) == distance or r1 + r2 == distance:
    print(1)
elif abs(r1 - r2) < distance < (r1 + r2):
    print(2)
else:
    print(0)

1번의 경우 동심원이기 때문에 distance가 0이고 두 반지름이 같은 조건이다.

2번의 경우 내접일 경우 distance가 두 반지름의 차이랑 같은 조건이다.

3번의 경우 서로 다른 두점에서 만나기 때문에 반지름의 차이가 distance보다는 크고 반지름의 합보다는 작은 조건이다.

4번의 경우 이외의 경우에 대한 조건이다.

 

728x90