공부하기/백준

[Python] 백준 풀기 1002 - 터렛

XEV 2022. 11. 11. 21:59

파이썬 백준 1002번

실버3

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

 

1002번: 터렛

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

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 수학, 기하학

 

 

 

 

 

문제 풀기

어떤 두 개의 원이 2차원 평면 위에 존재할 수 있는 방법에 대해 묻는 문제이다.

 

 

문제에서 주어진 x1, y1, r1, x2, y2, r2 는 원의 중심 좌표와 반지름으로 생각하면

1.  두 원의 중심과 반지름이 완벽히 같을때 무한의 교점을 갖는다.

        if x1 == x2 and y1 == y2 and r1 == r2:
            print(-1)

2. 두 원의 중심 거리의 크기가 두 반지름의 차 보다 크고 합 보다 작을때 두 개의 교점을 갖는다.

        elif (r1-r2)**2 < fnDistanceFromTurret(x1, x2, y1, y2) < (r1+r2)**2:
            print(2)

3. 두 원의 줌심 거리의 크기가 두 반지름의 합과 같거나 차와 같을때 한 개의 교점을 갖는다.

        elif fnDistanceFromTurret(x1, x2, y1, y2) == (r1+r2)**2 or fnDistanceFromTurret(x1, x2, y1, y2) == (r1-r2)**2:
            print(1)

4. 그 외 두 원은 서로 외부에 존재하거나 내부에 존재할때 교점이 생기지 않는다.

        else:
            print(0)

        r1 + r2 < distance
        |r1 - r2| > distance, r1 ≠ r2

 

 

 

 

 

코드 보기

import sys
inputdata = sys.stdin.readline

def fnNumberOfExistence(T):
    for _ in range(T):
        x1, y1, r1, x2, y2, r2 = map(int, inputdata().split())
        if x1 == x2 and y1 == y2 and r1 == r2:
            print(-1)
        elif (r1-r2)**2 < fnDistanceBetweenC(x1, x2, y1, y2) < (r1+r2)**2:
            print(2)
        elif fnDistanceBetweenC(x1, x2, y1, y2) == (r1+r2)**2 or fnDistanceBetweenC(x1, x2, y1, y2) == (r1-r2)**2:
            print(1)
        else:
            print(0)
 
def fnDistanceBetweenC(x1, x2, y1, y2):
    squaredDistance = (x2 - x1) ** 2 + (y2 - y1) ** 2
    return squaredDistance
 
 
if __name__ == "__main__":
    T = int(inputdata().strip())
    
    fnNumberOfExistence(T)




# 3


# 0 0 13 40 0 37
# 2

# 0 0 3 0 7 4
# 1

# 1 1 1 1 1 5
# 0