Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

hong_mok

[Baekjoon] 1002번: 터렛 본문

Baekjoon

[Baekjoon] 1002번: 터렛

moki 2022. 2. 17. 03:16

터렛

입력

첫째 줄에 테스트 케이스의 개수 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)

'Baekjoon' 카테고리의 다른 글

[Baekjoon] 4949번: 균형잡힌 세상  (0) 2022.02.23
[Baekjoon] 2108번: 통계학  (0) 2022.02.17
[Baekjoon] 2447번: 별 찍기 - 10  (0) 2022.02.17
[Baekjoon] 1011번: Fly me to the Alpha Centauri  (0) 2022.02.17
Comments