[Baekjoon] 1002번: 터렛

SeongMok Hong·2022년 9월 3일
0
post-custom-banner

터렛

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 이루어져 있다.

한 줄에 x1, y1, r1, x2, y2, r2가 주어진다. x1, y1, x2, y2는 -10,000보다 크거나 같고, 10,000보다 작거나 같은 정수이고, r1, r2는 10,000보다 작거나 같은 자연수이다.

3
0 0 13 40 0 37
0 0 3 0 7 4
1 1 1 1 1 5

출력

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

2
1
0

생각

두 점의 좌표 ( (x1, y1), (x2, y2) )가 주어지고, 두 점으로부터 목표물의 거리(r1, r2) 가 주어진다.

이때 목표물이 있을 수 있는 위치는, 중심이 (x1,y1), 반지름이 r1인 원과 중심이 (x2, y2), 반지름이 r2인 원 두개가 접하는 점의 개수(n)를 구하는 것과 같다.

네가지 경우로 나눌 수 있다.

  1. 두 원이 같은 원인 경우 (n = 무한대)
    -> 두 원의 중심이 같고 반지름이 같은 경우
  2. 두 원이 한점에서 만나는 경우 (n = 1)
    -> 두 원의 중심 사이의 거리가 반지름의 합과 같거나(외접) 차이(내접)와 같을 경우
  3. 두 원이 두 점에서 만나는 경우 (n = 2)
    -> 두 원의 중심 사이의 거리가 반지름의 차이와 반지름의 합 사이의 값일 경우
  4. 두 원이 만나지 않는 경우 (n = 0)
    -> 나머지 경우

이걸 그대로 조건문으로 옮기면 될 것 같다..!

코드

T = int(input())

for i in range(T):
    x1, y1, r1, x2, y2, r2 = list(map(int, input().split()))

    d = ((x1-x2)**2 + (y1-y2)**2) ** 0.5

    if d == 0 and r1 == r2:
        print(-1)
    elif d == r1 + r2 or d == abs(r1-r2) :
        print(1)
    elif abs(r1-r2) < d < r1 + r2 :
        print(2)
    else :
        print(0)
profile
안녕하세요. 홍성목입니다.
post-custom-banner

0개의 댓글