sm 기술 블로그

103. 1004(어린 왕자) 본문

문제/백준_파이썬

103. 1004(어린 왕자)

sm_hope 2022. 6. 23. 20:28
import sys
input = sys.stdin.readline

T = int(input())
result = ""

for _ in range(T):
    x1, y1, x2, y2 = map(int, input().split())
    N = int(input())
    cnt = 0

    for _ in range(N):
        cx, cy, r = map(int, input().split())
        d1 = ((x1 - cx)**2 + (y1 - cy)**2)**0.5
        d2 = ((x2 - cx)**2 + (y2 - cy)**2)**0.5
        if((d1 > r and d2 < r) or (d1 < r and d2 > r)):
            cnt += 1
    result += str(cnt) + "\n"

print(result)

문제요약

출발점과 도착점이 있는데 원을 진입,이탈하는 수를 구하라.

설명

다음과 같이 빨간선이 경로이고 빨간점이 출발점과 도착점이다.

원의 거리는

다음과 같이 구할 수 있다.

이 거리가 r보다 작으면 진입 크면 이탈한 것이다.

도착점, 출발점이 주어지는 원 안에 둘다 속하거나 둘다 속하지 않으면 진입이나 이탈이 발생하지 않는다.

즉, 도착점이 r보다 작아서 진입해야하고, 출발점이 r보다 커서 이탈해야 한다면 진입|이탈이 발생한 것이다. 

혹은 도착점이 r보다 커서 이탈해야하고, 출발점이 r보다 작아서 진입해야한다.

예를 들어 12 1 2 와 2 2 2 일때, 시작점과 출발점이 -5 1 12 1 인 경우를 보자

 

12 1 2는

이다.

d1이 r보다 크고, d2가 r보다 작아서 진입|이탈이 발생한 경우이다.

 

2 2 2는

이다.

r이 d1과 d2보다 작기 때문에 진입|이탈이 발생하지 않는다.

진입,이탈이 발생하지 않는 경우는 점과 원이 아닌 두원이라 했을 때 위와 같다고 볼 수 있다.

 

마지막으로 최종으로 정리하면

다음과 같이 하나의 점의 거리는 반지름 보다 작고, 나머지 하나의 점의 거리가 반지름 보다 크다면 이탈 | 진입이 발생하고,

다음과 같이 d1,d2가 반지름의 길이보다 작고, 혹은 클 때는 진입|이탈이 발생하지 않는다.

'문제 > 백준_파이썬' 카테고리의 다른 글

105. 5086(배수와 약수)  (0) 2022.06.24
104. 1358(하키)  (0) 2022.06.23
102. 1002(터렛)  (0) 2022.06.22
101. 택시 기하학(3053)  (0) 2022.06.22
100. 2477(참외 밭)  (0) 2022.06.22
Comments