Posts [알고리즘] 프로그래머스 - 배달
Post
Cancel

[알고리즘] 프로그래머스 - 배달


문제

N개의 마을에 1부터 N까지 번호가 부여되어 있음
마을들은 양방향 도로가 존재
1번 마을에서 각 마을에 음식 배달
K 시간 이하로 걸리는 마을만 배달 가능
배달 할 수 있는 마을의 개수를 구하라
마을 개수 N은 1이상 50이하
road의 길이(도로 정보의 개수)는 1이상 2,000이하
road의 각 원소는 (a, b, c)로 이루어져 있음
a, b는 마을 번호, c는 도로를 지나는데 걸리는 시간
도로 정보는 중복되지 않음
K는 배달 가능 시간이며, 1이상 500,000 이하


입출력 예시

NroadKresult
5[[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]]34


접근

그래프 최단 경로 문제이다.
다익스트라 알고리즘을 이용하여 한 마을(1번)에서부터 다른 마을로의 최단경로를 모두 구한다.
그 후 K 이하인 경로만 찾으면 된다.
파이썬으로 다익스트라 코드를 처음 짜봤는데 어딘지 모르게 지저분해보여서 맘에 안든다.

코드

  • 파이썬 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import heapq
def solution(N, road, K):
    heap = []
    v = [[] for i in range(N+1)]
    d = [987654321 for i in range(N+1)]
    for x, y, n in road:
        v[x].append([n, y])
        v[y].append([n, x])
    d[1] = 0
    heapq.heappush(heap, [d[1], 1])

    while len(heap) > 0:
        now = heapq.heappop(heap)
        if(d[now[1]] != now[0]):
            continue
        for nxt in v[now[1]]:
            if d[nxt[1]] > now[0] + nxt[0]:
                d[nxt[1]] = now[0] + nxt[0]
                heapq.heappush(heap, [d[nxt[1]], nxt[1]])

    cnt = 0
    for i in range(1, len(d)):
        if d[i] <= K:
            cnt += 1

    return cnt


This post is licensed under CC BY 4.0 by the author.

[알고리즘] 프로그래머스 - 문자열 압축

[알고리즘] 프로그래머스 - FloodFill