sm 기술 블로그
103. 1004(어린 왕자) 본문
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