공부기록

섬 연결하기 본문

코테/프로그래머스

섬 연결하기

코타쿠 2021. 9. 5. 11:14

문제

https://programmers.co.kr/learn/courses/30/lessons/42861

코드

import java.util.*;

class Solution{
    class Node implements Comparable<Node>{
        int e;
        int w;
        public Node(int e, int w){
            this.e = e;
            this.w = w;
        }

        @Override
        public int compareTo(Node obj){
            if(this.w > obj.w)
                return 1;
            else if(this.w < obj.w)
                return -1;
            else
                return 0;
        }
    }

    public int solution(int n, int[][] costs) {
        int answer = 0;
        ArrayList<Node> g[] = new ArrayList[n];
        boolean check[] = new boolean[n];
        PriorityQueue<Node> pq = new PriorityQueue<>();
        for(int i=0; i<g.length; i++)
            g[i] = new ArrayList<>();

        for(int[] cost : costs){
            g[cost[0]].add(new Node(cost[1], cost[2]));
            g[cost[1]].add(new Node(cost[0], cost[2]));
        }

        check[0] = true;
        for(Node node : g[0])
            pq.add(node);

        for(;!pq.isEmpty();){
            Node cur_node = pq.poll();
            if(check[cur_node.e])
                continue;
            answer += cur_node.w;
            check[cur_node.e] = true;
            for(Node node : g[cur_node.e]){
                pq.add(node);
            }
        }


        return answer;
    }
}

피드백

  • MST 구하는 알고리즘인 프림 알고리즘을 구현했다.
    • 다이직스트라와 비슷했다.
  • 나는 마지막 간선을 고르는 for문을 n-1로 했다가 안됬었다.
    • 간선은 n-1개만 존재하면 되는데 왜 안될까?
  • 답은 현재 노드가 leaf node이면 간선이 없고, 따라서 1개의 간선을 여기서 산출하지 못하기 때문이다.
    • 즉, 모든 node가 간선을 새로 만들어 내지는 않기 때문
  • 이 때문에 while()을 해서 모든 간선에 대해 check해서 구현해야함.

'코테 > 프로그래머스' 카테고리의 다른 글

입국심사  (0) 2021.09.06
단속카메라  (0) 2021.09.05
여행경로  (0) 2021.09.04
이중우선순위큐  (0) 2021.09.03
다음 큰 숫자  (0) 2021.08.30