합승 택시 요금
풀이시간
- 약 45분
Code
function solution(n, s, a, b, fares) {
var answer = Infinity;
let map = [[]];
for(let i =0; i<n+1; i++){
map[i] = new Array(n+1);
map[i].fill(Infinity);
}
for(let fare of fares){
let [start,end,fee]=fare
map[start][end]=fee;
map[end][start]=fee;
}
// j 중간지
for(let j=1; j<n+1; j++){
for(let i=1; i<map.length; i++){
for(let k=1; k<map.length; k++){
if(i==k){
map[i][k] = 0;
}else{
map[i][k] = Math.min(map[i][k],map[i][j]+map[j][k]);
}
}
}
}
for(let i=1; i<=n; i++) {
answer = Math.min(answer, map[s][i]+map[i][a]+map[i][b]);
}
return answer;
}
KEY
- Floyd-Warshall Algorithm
IDEA
- n : 지점갯수
- s : 출발점
- a : a 도착지
- b : b 도착지
fares: 요금표
- 최종 요금 : 같이가는 요금 + 각자 가는요금(a+b)
- 처음 풀이에서는 각 노드간의 거리를 계산하기 위해 dfs 를 사용했다.
- dfs의 경우 각 노드마다 매번 전체 노드를 방문해야 했기 때문에 시간초과 오류.
- 경로 탐색 알고리즘 중
플로이드-워셜 알고리즘(Floyd-Warshall Algorithm)
을 사용했다. - 두 노드간의 최단 거리를 계산함에 있어 다른 노드를 경유지로 택하는 경우와 비교하여 최소값을 판단한다.
- 위 같은 과정을 모드 노드 수만큼 반복해 주면 각 노드간의 최단 비용을 계산할 수 있다.
- 시간복잡도는
O(n^3)
- 문제 조건의 n=200 이라는 비교적 적은 숫자로 주어졌기에 사용할 수 있는것 같다.