프로그래머스 LEVEL 3(합승 택시 요금)

image

  • 사용 언어 : javascript

  • 해결 날짜 : 2023-01-04

  • 해결 방법 :

    • 플로이드 워셜을 통해 문제 해결
      • 무지와 어피치가 같은 택시로 동행하다 중간에 갈라지는 경우도 있으므로 모든 정점에서 다른 모든 정점까지의 최단 거리를 계산해야함
      • node의 개수(n)가 200 이하이므로 3중 for문까지 커버 가능
    • graph에 fares에 담긴 양방향 경로 저장
    • 플로이드 워셜 알고리즘으로 각 정점에서 다른 모든 정점까지의 최단 거리 계산
    • 0부터 n까지 돌며 그래프에 저장된 경로를 탐색
      • 최솟값과 경유지를 거쳤을 때의 최단 경로(graph[s - 1][i] + graph[i][a - 1] + graph[i][b - 1])를 비교후 작은 값으로 update
  • 회고 :

    • x
  • 코드

    function solution(n, s, a, b, fares) {
      let answer = 0;
      const graph = Array.from({ length: n }, () => Array(n).fill(Infinity));
    
      for (const [from, to, cost] of fares) {
        graph[from - 1][to - 1] = cost;
        graph[to - 1][from - 1] = cost;
      }
    
      for (let i = 0; i < n; i++) {
        graph[i][i] = 0;
        for (let j = 0; j < n; j++) {
          for (let k = 0; k < n; k++) {
            graph[j][k] = Math.min(graph[j][k], graph[j][i] + graph[i][k]);
          }
        }
      }
    
      let min = Infinity;
      for (let i = 0; i < n; i++) {
        min = Math.min(min, graph[s - 1][i] + graph[i][a - 1] + graph[i][b - 1]);
      }
    
      return min;
    }
    
  • 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges