오구의코딩모험

[Python] 1002번 : 터렛 본문

프로그래밍 공부/백준 알고리즘

[Python] 1002번 : 터렛

오구.cpp 2022. 8. 8. 21:25
반응형

 

문제 설명 3줄 요약

 

1. 두 좌표에 터렛이 각각 존재한다.

2. 두 터렛에서 타겟까지의 거리가 주어진다.

3. 타겟이 존재할 수 있는 위치의 수를 구하여라.

 

 

 

알고리즘의 분류가 수학, 기하학인 것처럼

문제 설명이 굉장히 길지만

두 원의 접점을 구하라는 문제이다!

 

수학방(mathbang.net)

 

각 중심(좌표)과 반지름(타겟까지의 거리) 가 주어졌을 때,

겹치는 접점의 경우의 수

위의 그림을 참고한다면 쉽게 알 수 있다!

 

  • 기본적으로 두 원이 일치할 때, 답은 -1
  • (2) 두 원이 외접할 때, 답은 1
  • (3) 두 원이 내접할 때, 답은 1
  • (4) 두 원이 서로 떨어져 있고 만나지 않을 때, 답은 0
  • (5),(6) 한 원이 다른 원의 내부에 있고 두 원이 만나지 않을 때, 답은 0.
  • (1)과 같은 나머지 경우, 답은 2

 

 

6 가지 정도로 분류해서

문제를 해결해보자!

 

기본적인 입력 틀 부터 작성!

# math 모듈 불러오기
import math

# 테스트 케이스 개수 T 입력
T = int(input())
coordinate_list = []

if __name__ == "__main__":
    # x1,y1,r1,x2,y2,r2 순서의 테스트 케이스 입력 받기
    for testcase in range(T):
        coordinate_list.append(list(map(int, input().split())))

 

 

이번 문제는

수학인 만큼 math 모듈을 사용하였다.

 

두 중심 사이의 거리를 구할 때,

제곱근, sqrt()을 사용해야하므로 import math 를 써줬다!

 

for coordinate in coordinate_list:
        x1 = coordinate[0]
        y1 = coordinate[1]
        r1 = coordinate[2]
        x2 = coordinate[3]
        y2 = coordinate[4]
        r2 = coordinate[5]

        # 입력 받은 좌표 사이의 거리 구하기
        distance = math.sqrt((x2-x1) ** 2 + (y2-y1) **2)
        
        # 두 원이 일치할 때
        if (distance == 0) and (r1 == r2):
            print(-1)
        # 두 원이 외접할 때
        elif (r1+r2) == distance :
            print(1)
        # 두 원이 내접할 때
        elif ((distance + r1) == r2) or ((distance + r2) == r1) :
            print(1)
        # 한 원이 다른 원의 내부에 있고 두 원이 만나지 않을 때
        elif abs(r2-r1) > distance :
            print(0)
        # 두 원이 서로 떨어져 있고 만나지 않을 때
        elif (r1+r2) < distance :
            print(0)
        else :
            print(2)

 

조건을 앞서 구해놨기에

차근차근 값을 고려하여 조건을 걸러나가면 된다.

 

 

여기서

한 원이 다른 원의 내부에 있고 두 원이 만나지 않을 때,

반지름(타겟까지의 거리)의 대소 관계를 모르므로

빼준 후 절댓값 함수인 abs() 함수를 덮어줬다!

 

 

 

결과

 

 

 

 

맞았습니다!

 

 

 

별 다른 알고리즘 없이

수학적인 접근이 필요한 문제이기에

어렵지 않은 문제였습니다!

 

 

반응형
Comments