코딩테스트

[프로그래머스][C++] 배달

이쿠우우 2022. 3. 25. 17:15
반응형

 

https://programmers.co.kr/learn/courses/30/lessons/12978

 

코딩테스트 연습 - 배달

5 [[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]] 3 4 6 [[1,2,1],[1,3,2],[2,3,2],[3,4,3],[3,5,2],[3,5,3],[5,6,1]] 4 4

programmers.co.kr

글쓴이의 답

개인적인 풀이 임으로

이것보다 더 좋은 알고리즘은 많음...

이렇게도 풀이하는구나.. 공유하기 위해 올림...

 

이 문제는 무조건 다익스트라(dijkstra) 알고리즘을 사용해서 풀 수 있음.

DFS를 사용해서 풀이하니 시간초과가 발생해서 결국 풀이를 보고

다익스트라(dijkstra) 알고리즘을 배워서 풀이함.

 

import heapq



def dijkstra(start, link, N):

    result = [1e9] * (N+1)
    result[start] = 0
    heap = []
    heapq.heappush(heap, (start, 0))
    while heap :
        destination, distance = heapq.heappop(heap)
        if result[destination] < distance:
            continue

        for des, dis in link[destination]:
            nextDistance = distance + dis
            if nextDistance < result[des]:
                result[des] = nextDistance
                heapq.heappush(heap, (des, nextDistance))
    return result



def solution(N, road, K):
    answer = 0
    link = [[]for _ in range(N+1)]
    for x, y, z in road:
        link[x].append((y, z))
        link[y].append((x, z))

    result = dijkstra(1, link, N)

    for distanceResult in result:
        if distanceResult <= K:
            answer+=1

    return answer



꾸준히 하다보면 실력이 늘겠지..

반응형