백준 1004번 (파이썬)

Jiya·2025년 3월 9일


처음에 문제 보고 와 이거 뭐지 했었습니다.
한참을 고민해보니 어떤 원리인지 대강 파악이 되더군요.
생각보다 쉬운 원리였습니다.

로직은 금방 짰는데 문법이 계속 틀려서 디버깅 하는데 시간이 많이 걸렸습니다.

정답

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)

개선 사항:

  1. 입력 받는 좌표를 바로 변수에 할당하여 가독성 향상
  2. 리스트 대신 집합(set)을 사용하여 연산 효율성 향상
  3. 거리 계산을 미리 변수에 저장하여 코드 가독성 향상
  4. 집합의 대칭 차집합 연산자 ^를 사용하여 코드 간소화 (출발점에만 있거나 도착점에만 있는 행성계의 개수)
  5. 변수명을 더 명확하게 지정
  • set()을 사용한 이유?

set()은 파이썬의 내장 데이터 구조로, 리스트와 비슷하지만 몇 가지 중요한 차이점이 있습니다:

  • 중복 없음: 집합은 중복된 요소를 허용하지 않습니다. 같은 값을 여러 번 추가해도 한 번만 저장됩니다.
  • 순서 없음: 리스트와 달리 집합은 요소들의 순서를 유지하지 않습니다. 따라서 인덱싱(예: my_set[0])을 사용할 수 없습니다.
  • 빠른 검색: 어떤 요소가 집합에 있는지 확인하는 것이 리스트보다 훨씬 빠릅니다. 리스트는 O(n) 시간이 걸리지만, 집합은 O(1) 시간이 걸립니다.
  • 집합 연산: 합집합(|), 교집합(&), 차집합(-), 대칭 차집합(^) 같은 수학적 집합 연산을 지원합니다.
profile
코딩 공부 노트

0개의 댓글