알고리즘 문제풀이/프로그래머스

[2021 KAKAO BLIND RECRUITMENT] 합승 택시 요금

taemin 2021. 5. 8.

programmers.co.kr/learn/courses/30/lessons/72413

 

코딩테스트 연습 - 합승 택시 요금

6 4 6 2 [[4, 1, 10], [3, 5, 24], [5, 6, 2], [3, 1, 41], [5, 1, 24], [4, 6, 50], [2, 4, 66], [2, 3, 22], [1, 6, 25]] 82 7 3 4 1 [[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]] 14 6 4 5 6 [[2,6,6], [6,3,7], [4,6,7], [6,5,11], [2,5,12], [5,3,20], [2,4

programmers.co.kr

import heapq

INF = 987654321

def f(graph,s,n):
    dist = [INF]*(n+1)
    pq = [[0,s]]

    while pq:
        w,v = heapq.heappop(pq)

        if dist[v] != INF:
            continue
        
        dist[v] = w

        for nv,nw in graph[v]:
            if dist[nv] != INF:
                continue
            heapq.heappush(pq,[w+nw,nv])
    
    return dist

def solution(n, s, a, b, fares):
    graph = [[] for i in range(n+1)]
    
    for fare in fares:
        start,end,w = fare
        graph[start].append([end,w])
        graph[end].append([start,w])

    dist_s = f(graph,s,n)
    dist_a = f(graph,a,n)
    dist_b = f(graph,b,n)

    answer = 987654321
    for i in range(1,n+1):
        answer = min(answer,dist_s[i]+dist_a[i]+dist_b[i])

    return answer

풀이

A->i , S->i, B->i 의 합이 최소인 i 지점을 찾는 문제이다.

 

즉 S,A,B 를 시작점으로 하는 다익스트라를 3번하여 dist 목록을 구한다.

dist에는 출발지점에서 각 지점까지의 최단거리가 적혀있다.

 

dist의 인덱스 합을 통해  최단거리의 합의 최솟값을 구한다.

 

시간복잡도

다익스트라를 3번 사용했다 3* E*log(N) 이므로 O(E*log(N)) 이다.

댓글