ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준_5972_택배 배송(python)
    Algorithm/백준_생각정리 2023. 4. 5. 23:55

    ※ 접근법

    문제에서 시작 지점이 주어지고 그 지점에서 최단 거리를 구하는 문제였기 때문에 다익스트라 알고리즘을 떠올렸고 

    노드의 개수가 최대 오만 개로 많았기 때문에 우선순위 큐를 이용한 다익스트라 알고리즘 문제로 풀어야겠다고 생각했다.

     

    ※ 풀이

    1. 풀이법은 우선순위 큐를 이용한 다익스트라 구현과 너무 똑같기 때문에 주석으로 코드 한줄 한줄이 무엇을 의미하는지 달아놓겠습니다. (한 가지 틀린점이 있다면 문제에서 양방향이라고 말을 해줬기 때문에 입력받을 때 양방향으로 받았습니다.)

     

    import sys, heapq
    input = sys.stdin.readline
    
    n, m = map(int,input().split())
    INF = float("inf") # 무한대 상수 선언
    graph = [[] for _ in range(n+1)] # 노드와 노드 사이의 거리를 담을 graph 리스트 선언
    distance = [INF] * (n+1) # 처음에는 각 지점의 거리를 무한대로 distance 노드의 갯수만큼 초기화
    for i in range(m): # 간선의 갯수만큼 
        a, b, c = map(int,input().split())
        graph[a].append((b,c))
        graph[b].append((a,c)) # 노드 위치와 비용순으로 graph에 집어넣습니다.
    
    def dijkstra(s):
        q = [] 
        distance[s] = 0 # 자기자신과의 거리는 0으로 초기화합니다.
        heapq.heappush(q,(0,s)) # q에 (거리, 위치)를 담습니다.
        while q: 
            dist, cur = heapq.heappop(q) 
            if distance[cur] < dist: # 이미 계산돼 있는 최솟값보다 크다면 확인할 필요도 없으니 다음 반복으로 넘어갑니다.
                continue 
            for next in graph[cur]: # 이웃돼 있는 노드를 확인합니다.
                cost = dist + next[1] # dist 출발 지점에서 현재 노드까지의 거리 + 현재 노드에서 다음 노드까지의 거리
                if cost < distance[next[0]]: # 이미 계산돼 있는 최솟값이 더 작았다면 갱신해줍니다.
                    distance[next[0]] = cost 
                    heapq.heappush(q,(cost, next[0])) # 새로운 최솟값을 q에 넣고 다음 반복을 진행해줍니다.
        return distance[n]
    
    print(dijkstra(1))

     

    ※ 회고

     느리더라도 꾸준하게

Designed by Tistory.