[프로그래머스] 합승 택시 요금 JAVA

AMUD·2023년 12월 2일
0

Algorithm

목록 보기
77/78

문제


문제링크

접근

  • 효율성 점수가 따로 있는 문제였지만, 우선 정점의 최대 개수가 200이라는 점에서 완탐이 가장 먼저 떠올랐다.
  • 단순히 두 점에 관한 연산이 아니라 세 점 이상의 경우를 고려해야 했기 때문에 플로이드-워샬 알고리즘으로 각 정점끼리의 최소 비용을 구했다.
  • 그리고 출발점 기준으로 연결된 모든 정점들에 대해 같이 타고 간다고 가정하며 더 적은 비용을 찾아나갔다.

풀이

import java.util.*;

class Solution {
    public int solution(int n, int s, int a, int b, int[][] fares) {
        int[][] graph = new int[n][n];
        int INF = 10000000;
        
        for (int i = 0; i < n; i++) {
            Arrays.fill(graph[i], INF);
            graph[i][i] = 0;
		}
        
        for (int[] fare: fares) {
            int start = fare[0] - 1;
            int end = fare[1] - 1;
            graph[start][end] = fare[2];
            graph[end][start] = fare[2];
        }
        
        for (int k = 0; k < n; k++) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);
                }
            }
        }
        
        int answer = graph[s-1][a-1] + graph[s-1][b-1];
        for (int i = 0; i < n; i++) {
            if (i != s-1 && graph[s-1][i] != INF && graph[a-1][i] != INF && graph[b-1][i] != INF) {
                answer = Math.min(answer, graph[s-1][i] + graph[i][b-1] + graph[i][a-1]);
            }
        }
        
        return answer;
    }
}
profile
210's Velog :: Ambition Makes Us Diligent

0개의 댓글