본문 바로가기
PROGRAMMERS

[프로그래머스] - 합승 택시 요금 (LEVEL3)

by 나른한 사람 2021. 2. 13.

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

경로의 최소비용 찾기 문제

 

다익스트라 알고리즘이나 플로이드 와샬 알고리즘을 사용해서 풀 수 있다.

 

코드는 모든 경로의 최소비용을 구하는 플로이드 와샬이 더 깔끔하지만 속도는 다익스트라가 훨씬 빠르다.

 

<Dijkstra>

3*O(n^2)

import copy
def solution(n, s, a, b, fares):
    MAX = 100001*200
    
    nodes = [[MAX for _ in range(n+1)] for __ in range(n+1)]
    for c,d,f in fares: nodes[c][d] = nodes[d][c] = f
    costs = copy.deepcopy(nodes)
    
    for _s in [s,a,b]:
        toVisit = set({i+1 for i in range(n)})
        toVisit.remove(_s)
        costs[_s][_s] = 0
        while toVisit:
            _min, minidx = MAX, 0
            for i in toVisit:
                if costs[_s][i]<_min:
                    _min, minidx = costs[_s][i], i
            if minidx == 0: break
            toVisit.remove(minidx)
            for i in toVisit:
                costs[_s][i] = min(costs[_s][i], costs[_s][minidx] + nodes[minidx][i])
                
    answer = costs[s][a]+costs[s][b]
    for i in range(1,n+1):
        answer = min(answer,costs[s][i]+costs[a][i]+costs[b][i])
    return answer

 

<Floyd-Warshall>

O(n^3)

def solution(n, s, a, b, fares):
    MAX = 100001*200
    
    nodes = [[MAX for _ in range(n+1)] for __ in range(n+1)]
    for c,d,f in fares: nodes[c][d] = nodes[d][c] = f
    for i in range(n): nodes[i+1][i+1] = 0
    
    for i in range(1,n+1):
        for j in range(1,n+1):
            for k in range(1,n+1):
                if nodes[j][k] > nodes[j][i] + nodes[i][k]:
                    nodes[j][k] = nodes[j][i]+nodes[i][k]
                
    answer = nodes[s][a]+nodes[s][b]
    for i in range(1,n+1):
        if answer > nodes[s][i]+nodes[a][i]+nodes[b][i]:
            answer = nodes[s][i]+nodes[a][i]+nodes[b][i]
    return answer

 

댓글