

처음에 문제 보고 와 이거 뭐지 했었습니다.
한참을 고민해보니 어떤 원리인지 대강 파악이 되더군요.
생각보다 쉬운 원리였습니다.
로직은 금방 짰는데 문법이 계속 틀려서 디버깅 하는데 시간이 많이 걸렸습니다.
정답
import math
T = int(input())
for i in range(T):
coordinate = list(map(int, input().split()))
N = int(input())
data = []
for _ in range(N):
planet = list(map(int, input().split()))
data.append(planet)
# 원의 내부에 있으면 무조건 진입
# 출발점
count_start = []
count_end = []
for i in range(N):
if math.sqrt((data[i][0] - coordinate[0])**2 + (data[i][1] - coordinate[1])**2) < data[i][2]:
count_start.append(i)
if math.sqrt((data[i][0] - coordinate[2])**2 + (data[i][1] - coordinate[3])**2) < data[i][2]:
count_end.append(i)
only_start = [x for x in count_start if x not in count_end]
only_end = [x for x in count_end if x not in count_start]
print(len(only_start) + len(only_end))
AI 한테 좀 더 간결하고 쉬운 코드로 정리해달라고 했습니다.
import math
T = int(input())
for _ in range(T):
x1, y1, x2, y2 = map(int, input().split())
n = int(input())
start_inside = set()
end_inside = set()
for i in range(n):
cx, cy, r = map(int, input().split())
# 거리 계산
d1 = math.sqrt((cx - x1)**2 + (cy - y1)**2)
d2 = math.sqrt((cx - x2)**2 + (cy - y2)**2)
# 출발점이 행성계 내부에 있는지 확인
if d1 < r:
start_inside.add(i)
# 도착점이 행성계 내부에 있는지 확인
if d2 < r:
end_inside.add(i)
# 대칭 차집합(symmetric difference)을 계산하여 진입/이탈 필요한 행성계 수 계산
result = len(start_inside ^ end_inside)
print(result)
개선 사항:
set()을 사용한 이유?set()은 파이썬의 내장 데이터 구조로, 리스트와 비슷하지만 몇 가지 중요한 차이점이 있습니다: