알고리즘

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

박카스마시며코딩 2021. 12. 29. 22:04

https://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 java.util.*;
class Solution {
    static void cal(int[][] map, int n){
        for(int k = 1 ; k <= n ; k++){
            for(int i = 1 ; i <= n ; i++){
                for(int j = 1 ; j <= n ; j++){
                    if( i == j || i == k || j == k || map[i][k] == 0 || map[k][j] == 0){
                        continue;
                    }
                    if(map[i][j] == 0){
                        map[i][j] = map[i][k] + map[k][j];
                    }else{
                        map[i][j] = Math.min(map[i][k] + map[k][j], map[i][j]);
                    }
                }
            }
        }
    }
    public int solution(int n, int s, int a, int b, int[][] fares) {
        int answer = 0;
        int[][] map = new int[n+1][n+1];
        for(int[] fare : fares){
            int start = fare[0];
            int end = fare[1];
            int weight = fare[2];
            map[start][end] = weight;
            map[end][start] = weight;
        }
        cal(map, n);
        int result = map[s][a] + map[s][b];
        for(int i = 1; i <= n ; i++){
            if((s != i && map[s][i] == 0) || (a != i && map[i][a] == 0) || 
              (b != i && map[i][b] == 0) ){
                continue;
            }
            result = Math.min(result , map[s][i] + map[i][a] + map[i][b]);
        }
        answer = result;
        return answer;
    }
}