https://school.programmers.co.kr/learn/courses/30/lessons/72413
문제 분석:
알고리즘 선택 과정:
arr = 크기 (n+1) x (n+1) 배열로 초기화
// 자기 자신으로 가는 비용은 0, 나머지는 MAX_VALUE
for i in 1부터 n까지:
for j in 1부터 n까지:
if i == j:
arr[i][j] = 0
else:
arr[i][j] = INF
// 무방향 그래프 간선 정보 입력
for fare in fares:
v1, v2, cost = fare
arr[v1][v2] = min(arr[v1][v2], cost)
arr[v2][v1] = min(arr[v2][v1], cost)
// 플로이드-와샬
for k in 1부터 n까지:
for i in 1부터 n까지:
for j in 1부터 n까지:
// i에서 k를 거쳐서 j로 가는 경로가 존재할 때만 갱신
if arr[i][k] != INF and arr[k][j] != INF:
arr[i][j] = min(arr[i][j], arr[i][k] + arr[k][j])
// 최소 합승 비용 계산
minCost = INF
for i in 1부터 n까지:
// i에서 s로 가는 경로, i에서 a로 가는 경로, i에서 b로 가는 경로가 모두 존재할 때만 갱신
if arr[i][s] != INF and arr[i][a] != INF and arr[i][b] != INF:
minCost = min(minCost, arr[i][s] + arr[i][a] + arr[i][b])
return minCost
class Solution {
public int solution(int n, int s, int a, int b, int[][] fares) {
int answer = 0;
int[][] arr = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) {
continue;
}
arr[i][j] = Integer.MAX_VALUE;
}
}
for (int[] fare : fares) {
int v1 = fare[0];
int v2 = fare[1];
int cost = fare[2];
arr[v1][v2] = Math.min(arr[v1][v2], cost);
arr[v2][v1] = Math.min(arr[v2][v1], cost);
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) {
continue;
}
if (arr[i][k] != Integer.MAX_VALUE && arr[k][j] != Integer.MAX_VALUE) {
arr[i][j] = Math.min(arr[i][j], arr[i][k] + arr[k][j]);
}
}
}
}
int sum = Integer.MAX_VALUE;
for (int i = 1; i <= n; i++) {
if (arr[i][a] == Integer.MAX_VALUE || arr[i][b] == Integer.MAX_VALUE || arr[i][s] == Integer.MAX_VALUE) {
continue;
}
sum = Math.min(sum, arr[i][a] + arr[i][b] + arr[i][s]);
}
answer = sum;
return answer;
}
}