알고리즘/프로그래머스 카카오
카카오 블라인드 2021) 합승 택시 요금
Zin0_0
2021. 3. 7. 18:12
반응형
합승 택시 요금
코딩테스트 연습 - 합승 택시 요금
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에서 시작해 k를 경유하여, 각각 a와 b 목적지로 가는 비용의 최소를 구해주었다.
최근에 플로이드 와샬 문제를 많이 풀어서, 크게 어렵지 않게 풀 수 있었다.
코드
import java.util.Arrays;
class Solution {
public int solution(int n, int s, int a, int b, int[][] fares) {
int[][] map = initMap(n,fares);
floydWarshal(n,map);
return getMinCost(map,n, s, a, b);
}
private int getMinCost(int[][] map, int n, int s, int a, int b) {
int answer = Integer.MAX_VALUE;
for(int k=1; k<=n; k++) { // 문제에서 요구하는 답 = min(d[s][k] + d[k][a] + d[k][b]) (단, k = 1 ~ n)
answer = Math.min(answer, map[s][k]+ map[k][a] + map[k][b]);
}
return answer;
}
private void floydWarshal(int n, int[][] map) {
for(int k=1; k<=n; k++) {
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(i!=j && map[i][k] != Integer.MAX_VALUE && map[k][j] != Integer.MAX_VALUE) {
map[i][j] = Math.min(map[i][j], map[i][k] + map[k][j]);
}
}
}
}
}
private static int[][] initMap(int n, int[][] fares) {
int[][] map = new int[n+1][n+1];
for(int i=1; i<=n; i++) {
Arrays.fill(map[i], Integer.MAX_VALUE);
map[i][i] = 0;
}
for(int[] fare : fares) {
map[fare[0]][fare[1]] = fare[2];
map[fare[1]][fare[0]] = fare[2];
}
return map;
}
}
반응형