반응형

🤔 문제


https://programmers.co.kr/learn/courses/30/lessons/72413?language=python3 

 

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

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

😀 풀이


이 문제에서 합승 택시 요금의 최소 값을 구하기 위해서는 아래의 값이 필요합니다.

  • S -> X 까지 가는 데 드는 최소값
  • X -> A 까지 가는 데 드는 최소값 
  • X -> B 까지 가는 데 드는 최소값

위의 세 가지 값을 더한 값, 즉 S -> X 까지는 합승하고 X 에서부터 A, B가 따로가는 경우의 총 요금을 모든 X에 대해 구해보고 그 중 최소값을 구하면 정답을 구할 수 있습니다.

 

따라서 임의의 노드 a, b에 대하여 a -> b 로 가는데 드는 최소값을 알고 있어야하고 이를 위해 플로이드 워셜 알고리즘을 적용합니다. 플로이드 워셜 알고리즘에 대한 내용은 많이 나와있으므로 따로 설명하지 않고 바로 풀이 코드를 첨부하겠습니다.

 

💻 풀이 코드는 아래와 같습니다.

def solution(n, s, a, b, fares):
    INF = int(1e9)
    answer = INF
    graph = [[INF] * (n + 1) for _ in range(n + 1)]
    for start, dest, fare in fares:
        graph[start][dest] = fare
        graph[dest][start] = fare
    
    for i in range(1, n + 1):
        graph[i][i] = 0

    # 플로이드 워셜 알고리즘
    for k in range(1, n + 1):
        for i in range(1, n + 1):
            for j in range(1, n + 1):
                graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])

    for i in range(1, n + 1):
        cost = graph[s][i] + graph[i][a] + graph[i][b]
        answer = min(answer, cost)    

    return answer
복사했습니다!