관리 메뉴

JIE0025

[다익스트라][lv.2] 배달 - 파이썬(Python) 본문

알고리즘/프로그래머스

[다익스트라][lv.2] 배달 - 파이썬(Python)

Kangjieun11 2023. 10. 22. 00:03
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 
 
 
다익스트라 복습겸 풀었다.
 
 
이전에는 deque를 이용한 풀이 방식이었는데...
 
https://jie0025.tistory.com/475

 

[Summer/Winter Coding(~2018)][lv.2] 배달 - 파이썬(Python), 다익스트라

https://school.programmers.co.kr/learn/courses/30/lessons/12978 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는

jie0025.tistory.com

 
 
이번엔 heapq를 사용한 다익스트라로 구현했다.
 
 

✅ 정답코드

import sys
import heapq

INF = sys.maxsize

def dijkstra(start, distance, graph):
    
    q = []
    
    heapq.heappush(q, (0,start))
    distance[start] = 0
    
    while q:
        dist, now = heapq.heappop(q)
        
        if distance[now] < dist: #이미 최단거리 갱신된거면 건너뛴다.
            continue
        
        for connect_info in graph[now]: #연결된 친구들 찾기 #now를 거쳐서 가는게 최단거리일 경우 갱신해주기 위함이다.
            new_dist = dist + connect_info[1]  #cost 
            
            if new_dist < distance[connect_info[0]]: #해당노드까지의 거리보다 새롭게 계산한거리가 짧으면
                distance[connect_info[0]] = new_dist
                heapq.heappush(q, (new_dist, connect_info[0]))
        

    
def solution(N, road, K):
    # 1번 노드에서 전체 노드까지의 최단 거리를 찾아야한다 (다익스트라)
    # HeapQ를 써야한다.
    
    
    distance = [INF] * (N+1)
    
    graph = [[] for _ in range(N+1)]
    
    for a, b, cost in road:
        graph[a].append((b,cost))
        graph[b].append((a,cost))
        
    dijkstra(1, distance, graph)
    
    
    answer = 0
    for i in range(1, N+1):
        if distance[i] <= K:
            answer+=1

    return answer