<Algorithm> 184. 섬연결하기(Programmers)
by BFine반응형
1. 섬연결하기(Programmers)
사용 알고리즘 : MST(prim), 우선순위 큐, 그리디
-
처음에 보자마자 MST문제라고 느낌이 왔었는데 그리디 카테고리로 분류 되어있어서 다른 방법이 있는 줄 알았다 ....
MST 알고리즘을 살펴보면 그리디 인것을 알 수 있는데 순간마다 최적(cost가 작은) 경로를 선택하는 방법이라서 그렇다.
MST는 https://www.crocus.co.kr/733 여기에 아주 자세~하게 잘 나와있다..
문제에 대한 접근&생각
- 최소 비용으로 모든 섬이 연결 가능하게 -> MST!
내 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.PriorityQueue; class Solution { static List<Node>[] map; public int solution(int n, int[][] costs) { /*************************** * prim 알고리즘을 이용해서 MST를 * 구하고 그 가중치 총합을 출력한다. ***************************/ map = new ArrayList[n]; for(int i = 0; i < n; i++) map[i] = new ArrayList<>(); for(int i = 0; i < costs.length; i++) { int a = costs[i][0]; int b = costs[i][1]; int c = costs[i][2]; map[a].add(new Node(b, c)); map[b].add(new Node(a, c)); } vistied = new boolean[n]; dist = new int[n]; prim(); return Arrays.stream(dist).sum(); } static int[] dist; static boolean vistied[]; private static void prim() { PriorityQueue<Node> pq = new PriorityQueue<>(Node::compare); Arrays.fill(dist, 99999); dist[0] = 0; pq.add(new Node(0, dist[0])); while (!pq.isEmpty()) { Node node = pq.remove(); if(vistied[node.vertax]) continue; vistied[node.vertax] = true; // 여기에 방문설정하는 이유는 양방향성 떄문에 // 왔던길 돌아가는 것을 방지하기 위함이다. // 자신이 기준점이 되는 순간에 자신과 가장 가까운 // 거리를 알 수있기 때문에 더이상 방문할 필요가 없다. for(Node adj : map[node.vertax]) { if(!vistied[adj.vertax]) { if(dist[adj.vertax] > adj.cost) { pq.add(new Node(adj.vertax, adj.cost)); dist[adj.vertax] = adj.cost; } } } } } static class Node{ int vertax,cost; public Node(int vertax, int cost) { super(); this.vertax = vertax; this.cost = cost; } private static int compare(Node o1, Node o2) { return Integer.compare(o1.cost, o2.cost); } } } | cs |
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 186. 가르침(BJO) (0) | 2019.04.23 |
---|---|
<Algorithm> 185. 창용마을 무리의 개수(SWExpert) (0) | 2019.04.22 |
<Algorithm> 183. 여행가자(BJO) (0) | 2019.04.22 |
<Algorithm> 182. 가장 빠른 문자열 타이핑(SWExpert) (0) | 2019.04.22 |
<Algorithm> 181. K번째수(BJO) (0) | 2019.04.22 |
블로그의 정보
57개월 BackEnd
BFine