-
[프로그래머스]합승택시요금_Java알고리즘문제풀이/프로그래머스 2021. 11. 25. 00:10
--문제--
https://programmers.co.kr/learn/courses/30/lessons/72413?language=java
코딩테스트 연습 - 합승 택시 요금
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
--문제풀이--
문제에 대하여 그래프 문제로 방향성이 없는 연결 그래프에서 최단 경로를 구하는 문제였다.
그래서 생각해본 결과 플로이드와 다익스트라로 풀이를 해보는 것으로 결정하여 문제를 풀이를 진행했습니다.
플로이드 하면서 가장 중요한 점은
경 출 도
경유지 출발지 도착지 가 가장 중요하고
다익스트라에선 중요한 건
한지점 A기준으로만 최단거리를 구하는 것이라는 것을 인지하여 코드를 구현하는 것입니다.
-- 코드--
플로이드
package Level3; public class 합승택시요금_플로이드 { public static void main(String[] args) { int[][] temp= {{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}}; System.out.println(solution(6,4,6,2,temp)); } public static int solution(int n, int s, int a, int b, int[][] fares) { int answer = Integer.MAX_VALUE; int[][] map=new int[n+1][n+1]; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ map[i][j]=20000001; } map[i][i]=0; } for(int i=0;i<fares.length;i++){ map[fares[i][0]][fares[i][1]]=fares[i][2]; map[fares[i][1]][fares[i][0]]=fares[i][2]; } //플로이드 와샬의 가장 중요한 경 출 도 for(int k=1;k<=n;k++){//경유지 for(int i=1;i<=n;i++){//출발지 for(int j=1;j<=n;j++){//도착지 if(map[i][j]>map[i][k]+map[k][j]){ map[i][j]=map[i][k]+map[k][j]; } } } } for(int i=1;i<=n;i++){ answer=Math.min(answer,map[s][i]+map[i][a]+map[i][b]); } return answer; } }
다익스트라
package Level3; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.PriorityQueue; public class 합승택시요금_다익스트라버전 { public static void main(String[] args) { int[][] temp= {{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}}; System.out.println(solution(6,4,6,2,temp)); } static class node implements Comparable<node>{ int to,weight; public node(int to, int weight) { super(); this.to = to; this.weight = weight; } @Override public int compareTo(node o) { return this.weight-o.weight; } } static List<ArrayList<node>> list =new ArrayList<>(); public static int solution(int n, int s, int a, int b, int[][] fares) { int answer = Integer.MAX_VALUE; for(int i=0;i<=n;i++) { list.add(new ArrayList<>()); } for(int i=0;i<fares.length;i++) { list.get(fares[i][0]).add(new node(fares[i][1],fares[i][2])); list.get(fares[i][1]).add(new node(fares[i][0],fares[i][2])); } int[] startA=new int[n+1]; int[] startB=new int[n+1]; int[] start=new int[n+1]; Arrays.fill(startA, 20000001); Arrays.fill(startB, 20000001); Arrays.fill(start,20000001); startA=Dijkstra(a,startA); startB=Dijkstra(b,startB); start=Dijkstra(s,start); for(int i=1;i<=n;i++){ answer=Math.min(answer, startA[i]+startB[i]+start[i]); } return answer; } private static int[] Dijkstra(int start,int[] costs) { PriorityQueue<node> pq=new PriorityQueue<>(); for(node cur:list.get(start)) { costs[cur.to]=cur.weight; } costs[start]=0; for(node temp:list.get(start))pq.add(temp); while(!pq.isEmpty()) { node curnode=pq.poll(); if(costs[curnode.to]<curnode.weight)continue; for(node next:list.get(curnode.to)) { if(costs[next.to]>curnode.weight+next.weight) { costs[next.to]=curnode.weight+next.weight; pq.add(new node(next.to,curnode.weight+next.weight)); } } } return costs; } }
'알고리즘문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스]징검다리건너기_Java (0) 2021.11.25 [프로그래머스]경주로건설_Java (0) 2021.11.25 [프로그래머스]N-Queen_Java (0) 2021.08.07 [프로그래머스]디스크컨트롤_Java (0) 2021.08.07 [프로그래머스]보석쇼핑_Java (0) 2021.08.03