(프로그래머스 12978) 배달

ps  · 2 mins read

이해

  • N개의 마을이 1부터 N까지 번호가 각각 하나씩 부여되어 있고, 각 마을은 양방향으로 통행할 수 있는 도로로 연결되어 있다.
  • 1번 마을에 있는 음식점에서 K시간 이하로 배달이 가능한 마을에서만 주문을 받을 때 음식 주문을 받을 수 있는 마을의 개수를 return하라.

계획

  • 1번 마을로부터 모든 마을까지의 최단 경로를 구한다.
  • 최단 경로는 다익스트라 알고리즘을 사용하여 구해준다.
  • 최단 경로가 K이하인 마을의 개수를 센다.

실행

import heapq

def solution(N, road, K):
    
    graph = [[] for _ in range(N)]
    for a, b, c in road:
        graph[a-1].append((b-1, c))
        graph[b-1].append((a-1, c))
    INF = 1e9
    distances = [INF for _ in range(N)]
    queue = []
    heapq.heappush(queue, (0, 0))
    distances[0] = 0
    
    while queue:
        now, dist = heapq.heappop(queue)
        if dist > distances[now]:
            continue
        for adj in graph[now]:
            cost = dist + adj[1]
            if cost < distances[adj[0]]:
                distances[adj[0]] = cost
                heapq.heappush(queue, (adj[0], cost))
    
    return len([dist for dist in distances if dist <= K])
        

개선

  • 딱히 없는 것 같다.

회고

  • 최단 경로 유형의 단순한 문제였다. 쉬웠다.
  • heqpq 모듈을 오랜만에 사용하다 보니 heapq 모듈에서 제공되는 여러 함수들의 사용법이 잘 기억이 안 났다. 제대로 기억하자!