알고리즘 유형 : 기하
풀이 참고 없이 스스로 풀었나요? : O
https://www.acmicpc.net/problem/1004
import sys
input = sys.stdin.readline
T = int(input())
for _ in range(T):
x1, y1, x2, y2 = map(int, input().split())
n = int(input())
count = 0
for _ in range(n):
c_x, c_y, r = map(int, input().split())
# d1은 출발지에서 주어진 원의 중심까지의 거리
# d2는 도착지에서 주어진 원의 중심까지의 거리
d1 = ((c_x - x1)**2 + (c_y - y1)**2)**0.5
d2 = ((c_x - x2)**2 + (c_y - y2)**2)**0.5
# d가 r보다 작으면 원 안에 있단 뜻이고,
# 크면 원 밖에 있다는 뜻임
# 하나는 원 안에 있고 하나는 원 밖에 있을 때
# 이 원의 경계, 즉 행성계를 반드시 지나가므로
# 카운팅해줌
if (d1-r)*(d2-r) < 0:
count += 1
print(count)
풀이 요약
주어진 원에 대해, 출발지가 원 안에 있고 도착지가 원 밖에 있거나, 출발지가 원 밖에 있고 도착지가 원 안에 있는 두 경우에 대해, 출발지에서 도착지로 이동하려면 반드시 이 원의 경계를 지나가야 한다.
출발지, 도착지 둘 다 원 안에 있거나 원 밖에 있다면 이 원의 경계를 지나지 않고도 출발지에서 목적지로 도달할 수 있다.
따라서 주어지는 원의 정보 각각에 대하여, 그 원의 중심과 출발지, 도착지까지의 거리 d1, d2를 구하고, 이 것과 반지름의 대소 관계로 출발지&도착지가 원 내부에 있는지 외부에 있는지를 알아내고,
위의 원리를 적용하여 조건문으로 카운팅을 해준다.
배운 점, 어려웠던 점