Blog blog = new Korea()

알고리즘

[백준] 1002 터렛 (Python)

newkr 2024. 8. 26. 01:42
728x90

문제에 익숙한 용어와 스타크래프트 그림이 있어서 풀어보고 싶었다.

처음에 문제를 읽었을 때, 두 좌표간 공통의 지점을 찾는 문제구나까지는 바로 인지했으나, 원의 접점을 구하는 문제라는 것을 깨닫기 까지는 아주 조금  더 걸렸던 것 같다. 즉, 두 원 사이에 접점의 개수를 구하면 되는 문제이다.

두 원이 접할 수 있는 경우의 수는 많지는 않다.
 1) 두 원 사이에 겹치는 점이 2개일 때
 2) 두 원 사이에 겹치는 점이 없을 때
 3) 두 원 사이에 겹치는 점이 1개일 때

그리고 3번은 다시 2가지 경우로 나뉜다.
 1) 외접의 경우
 2) 내접의 경우

외접의 경우는 8을 생각하면 될 것이고, 내접의 경우는 @정도가 적당할 것 같다. 물론 완벽한 예시들은 아니지만, 글자로 표시하기에는 이 정도면 충분해보인다. 그림 자료를 구해와서 붙여넣는 것은 일이 더 생기는 거니까..

원의 접점을 구하는 법은 공식으로 나와있다.

두 원의 중심점 사이의 거리를 구하고, 이를 두 원의 반지름을 더하거나 빼서 비교해주면 된다.
코드는 아래와 같다.

import sys, math

# 1002 터렛
T = int(input())

for i in range(T):
    x1, y1, z1, x2, y2, z2 = map(int, sys.stdin.readline().split())
    
    # 두 원의 거리 계산
    d = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)

    # case에 따른 접점 개수
    # 1) 두 원이 동일할 때
    if d == 0 and z1 == z2:
        print(-1)
    # 2) 두 원이 내접하거나, 외접하여 접점이 1개일 때
    elif (d == z1 + z2) or (d == abs(z1 - z2)):
        print(1)
    # 3) 두 원의 접점이 2개일 때
    elif abs(z1 - z2) < d < z1 + z2:
        print(2)
    # 4) 이 외에는 원의 접점이 존재하지 않음
    else:
        print(0)

 

이 문제를 풀면서 느낀점은 딱 한 가지다.

일부 수학 공식들은 외워두는 것이 알고리즘 풀이에 큰 도움이 되겠구나.

오랜만에 알고리즘 문제를 풀어보니 나름 재밌었던 것 같다. 종종 너무 어렵지 않은 문제들을 풀어보도록 다시 습관을 들여봐야겠다.

728x90