본문 바로가기

백준 문제풀이

1002번 - 터렛 / silver 3 / 수학-기하학

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

 

1002번: 터렛

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

www.acmicpc.net

'''
1002번 - 터렛 / silver 3 / 수학-기하학
'''
import sys
import math

input = sys.stdin.readline

t = int(input())
for _ in range(t):
    a, b, c, x, y, z = map(int, input().split())
    dis = math.sqrt((a-x)**2 + (b-y)**2) 
    if dis == 0:
        if c==z:
            print(-1)
        else:
            print(0)
    else:
        if c+z == dis or abs(c-z) == dis:
            print(1)
        elif abs(c-z) < dis < c+z:
            print(2)
        else:
            print(0)

 

해당 문제를 풀기 위해서는 수학 지식 필요

 

좌표와 거리를 입력 받으면, 원을 하나 만든다고 생각

- 좌표는 중점, 거리는 해당 원의 반지름

 

따라서 좌표와 거리를 두 번 입력 받으니 원을 두개 만든다고 생각

 

1. 두 원의 중심 거리를 구하기 (dis)

 

2. dis == 0 이면 두 원의 중점 좌표가 같다는 의미

2-1. 두 원의 거리 또한 같으면, 똑같은 두 원이 겹쳐있는 경우 / -1

2-2. 거리가 다르면, 중점좌표가 같지만, 원의 크기가 다른 경우 / 0

 

3. dis != 0 이면 중점 좌표가 다르다는 의미 

3-1. 1번 원 반지름 + 2번 원 반지름 == dis 이면, 두 원이 외접해 있는 경우 / 1

3-1. abs(1번 원 반지름 - 2번 원 반지름) == dis 이면, 두 원이 내접해 있는 경우 / 1

3-2. abs(1번 반지름 - 2번 반지름) < dis < (1번 반지름 + 2번 반지름) 이면, 두 원이 접점 두개를 찍을 수 있는 경우 / 2

3-3. 그 외는 두 원이 서로 멀리 떨어져 있는 경우로 / 0