알고리즘

백준 - 1002번

joy_lee 2021. 8. 11. 20:44

터렛

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

 

1002번: 터렛

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

www.acmicpc.net

두 원의 접점의 개수를 구하는 문제다. 기하학 문제를 푼게 너무 오랜만이어서 여러가지 조건을 빠뜨리지 않는 것이 까다롭게 느껴졌다.

 

 

두 원의 중심, (x1, y1)과 (x2, y2)사이의 거리가 0인 경우와 아닌 경우로 크게 나눠서 

d == 0인 경우를 먼저 처리하고 continue로 다음 케이스를 처리하도록 만들었다.

d != 0인 경우는 세 경우가 있어서 if문을 사용했다.

만나지 않는 경우와 한 점에서 만난 경우는 or로,

마지막의 두 점에서 만나는 경우는 |r1 - r2| < d < r1 + r2 를 만족해야 하므로 and로 처리했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
= int(input())
for _ in range(T):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())
    distance = (x1 - x2)**2 + (y1 - y2)**2
    if distance == 0:
        if r1 != r2: print(0)
        elseprint(-1)
        continue
    r_plus = (r1 + r2)**2
    r_minus = (r1 - r2)**2
    if distance < r_minus or distance > r_plus: print(0)
    elif distance == r_plus or distance == r_minus: print(1)
    elif distance < r_plus and distance > r_minus: print(2)
cs

원래 거리는 √((x1 - x2)² + (y1 - y2)²) 로 계산해야 하지만 편의를 위해 제곱한 값들을 가지고 계산했다.

'알고리즘' 카테고리의 다른 글

백준 - 10870번  (0) 2021.08.13
백준 - 10872번  (0) 2021.08.13
백준 - 3053번  (0) 2021.08.11
백준 - 4153번  (0) 2021.08.10
백준 - 3009번  (0) 2021.08.10