Altiora Petamus

터렛 본문

1day-1algorithm

터렛

Haril Song 2021. 6. 17. 20:00
 

1002번: 터렛

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

www.acmicpc.net

 

🤔생각해보기

피타고라스 정리 를 활용하여 원의 교점을 구하는 문제다.

생각보다 고려해야할 조건이 많아서 성공할거라고 확신했음에도 7번 정도 실패했다...

하나씩 조건을 해결해가면 금방 풀 수 있는 문제이니 한 번 정리해보자.

우선 distance = 두 터렛 간의 거리 를 구해야 한다.

  1. 거리(distance)가 0 보다 커야 두 터렛이 같은 위치가 아니므로 아래 조건(2~4)을 적용한다.
  2. 만약 두 터렛이 각자 계산한 거리 r1, r2, 그리고 distance 중 가장 긴 값이 나머지 두 값의 합보다 크다면 만나지 않는다.
  3. distance = r1 + r2 라면 외접이며 1 곳에서 만난다.
  4. distance, r1, r2 중 가장 큰 값이 나머지 두 값의 합과 같다면 내접으로 1곳에서 만난다.
  5. distance가 0 이라면 두 터렛은 같은 위치에 있으므로 r1 == r2 라면 무한한 접점이 생긴다. -1 을 출력한다.
  6. distance가 0일 때 r1 ≠ r2 라면, 접점이 생기지 않는다.
import math
import sys

T = int(sys.stdin.readline())
for _ in range(T):
    x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().split())

    # 두 터렛 간의 거리(distance)
    c = (abs(x2 - x1) ** 2) + (abs(y2 - y1) ** 2)
    distance = math.sqrt(c)

    # 거리가 0보다 커야 같은 위치가 아니다.
    # 외접, 내접을 고려해야한다.
    r = sorted([distance, r1, r2])
    if distance > 0:
        # 외접
        if distance == r1 + r2:
            print(1)
        # 내접
        elif r[-1] == r[0] + r[1]:
            print(1)
        # 가장 긴 값이 나머지 합보다 클 경우 만나지 않는다.
        elif r[-1] > r[0] + r[1]:
            print(0)
        else:
            print(2)
    else:
        if r1 == r2:
            print(-1)
        else:
            print(0)

'1day-1algorithm' 카테고리의 다른 글

소수 구하기 (에라토스테네스의 체)  (0) 2021.06.18
Odd Occurrences In Array  (0) 2021.06.18
네 번째 점  (0) 2021.06.16
수 찾기  (0) 2021.06.15
베르트랑 공준  (0) 2021.06.12