본문 바로가기

코딩테스트/백준

[Python] 백준 1002. 터렛

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

 

1002번: 터렛

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

www.acmicpc.net

 

이 문제는 원에 대해서 알아야 쉽게 풀 수 있는 문제이다.

원에 대해 알아보며 코드를 작성해보자

두 점 사이의 거리 공식

Python Code

distance = (x2 - x1)**2 + (y2 - y1)**2
distance = math.sqrt(distance)

두 원의 위치 관계

1. 만나지 않는 경우

  • 외부에서 만나지 않음
    • r1 + r2 < d 인 경우

  • 내부에 포함
    • r1 - r2 > d인 경우

  • 동심원
    • d == 0 인 경우

 

코드를 작성해보면 다음과 같다

Python Code

    elif r1 + r2 < distance or abs(r2-r1) > distance or distance == 0:
        # 두 원이 서로 밖에 있으면 만나지 않을때 / 다른 원의 내부에 있으면 만나지 않는다. / 동심원인 경우
        print(0)

2. 접하는 경우(한 점에서 만나는 경우)

  • 외접
    • r1 + r2 = d

  • 내접
    • r1 - r2 = d or r2 - r1 = 0

Python Code

    elif r1 + r2 == distance or abs(r2-r1) == distance:
        # 두원이 외접할때 or 내접할때
        print(1)

 


3. 두 점에서 만나는 경우

  • r1 - r2 < d < r1 - r2

Python Code

    elif abs(r2-r1) < distance < abs(r2+r1):
        print(2)

마지막으로 문제에서 조건이 하나 더 있었는데

" 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우 -1을 출력한다"

이 의미는 서로 x,y 좌표가 같고 반지름또한 같으면 원이 겹치게 된다. 코드로 표현하면 다음과 같다.

    if x1 == x2 and y1 == y2 and r1 == r2:
        print(-1)

 


전체코드

input = sys.stdin.readline

n = int(input())

for case in range(n):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())
    distance = (x2 - x1)**2 + (y2 - y1)**2
    distance = math.sqrt(distance)
    if x1 == x2 and y1 == y2 and r1 == r2:
        print(-1)
    elif r1 + r2 < distance or abs(r2-r1) > distance or distance == 0:
        # 두 원이 서로 밖에 있으면 만나지 않을때 / 다른 원의 내부에 있으면 만나지 않는다. / 동심원인 경우
        print(0)
    elif r1 + r2 == distance or abs(r2-r1) == distance:
        # 두원이 외접할때 or 내접할때
        print(1)
    elif abs(r2-r1) < distance < abs(r2+r1):
        print(2)
  • abs를 사용한 이유 : 입력받는 반지름이 r1이 큰지 r2가 큰지 모르기 때문에 abs로 절댓값을 사용한다. 반지름은 0보다 항상 큰 값을 가진다는 것도 명심해둘것