본문 바로가기
Algorithm

[구현/수학] 백준 1002 터렛 - 파이썬(Python)

by jangThang 2022. 3. 28.
반응형

백준 온라인 저지

 

[ Contents ]

     

     

    1. 문제 (링크 참조)

     

    1002번: 터렛

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

    www.acmicpc.net

     

     

     

    2. 문제 풀이

     두 개의 터렛의 위치(x, y)와, 각각 자신의 반경(r)에서 얼마만큼 마린이 떨어져 있는지 알려줍니다. 즉, 두 원(감시 반경)이 만나는 지점의 수를 구해야 합니다.

     

     

     경우의 수는 크게 3가지입니다. 두 점이 만나는 경우와, 한 점에서 만나는 경우, 그리고 동심원이라서 무한대로 만나는 경우입니다. 

     

     하지만 문제의 예제입력을 보면, 위와 같은 경우도 있습니다... 즉 터렛에서 계산한 마린까지의 거리가 정확하지 않으며, 두 터렛이 전혀 다르게 예측할 수 있습니다.

     따라서 문제에 휘둘리지 마시고, 두 원이 이룰 수 있는 모든 경우의 수를 고려하시면 됩니다.

     

     

     

    3. 코드

    import sys
    input = sys.stdin.readline
    
    T = int(input())
    for _ in range(T):
        x1, y1, r1, x2, y2, r2 = map(int, input().split())
        dist = ((x1-x2)**2 + (y1-y2)**2)**0.5 #두 터렛 간의 거리 제곱
    
        #case1 두 원이 겹침
        if (x1, y1, r1) == (x2, y2, r2):
            print(-1)
    
        #case2 한 점만 만남 (내접, 외접)
        elif dist == abs(r1-r2) or dist == r1+r2:
            print(1)
    
        #case3 두 점만 만남
        elif abs(r1-r2) < dist < r1+r2:
            print(2)
    
        #case4 만나지 않음
        else:
            print(0)

     두 원의 중심거리를 구하고, if-else문으로 판별합니다.

     

     

     두 원이 내접하는 경우도 고려해서 판별해야 합니다.

     

    star가 되고나서 Tistory

    반응형

    댓글