プログラマーLV.3ネットワーク


1.問題リンク


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

2.解答

  • この問題は連合セットで解決できる.
  • このタイプは両方の関数について既知であり,容易に解くことができる.
    -findParent:関数の最終親を検索
    -union:
  • 親ノードを同じ親ノードにする
  • findParentでは、以下の内容にパス短縮が適用されます.
    - return parent[x] = findParent(parent[x]);
    −多くの問題において、上述した実施は、時間を短縮するであろう.
    -さらに時間がかかる場合もあります.
  • Discount-set問題はほぼ同様のモードで解決できる.
    1.自分を親にする(大切)
    2.findParent,union関数の実装
    3.問題の条件に従ってParentを検索し、union
  • を使用する

    3.コード

    class Solution {
        static int[] parent;
    
        public int solution(int n, int[][] computers) {
            int answer = computers.length;
    
            /**
             * 1. 자신을 부모로 갖는 배열 만들기
             */
            parent = new int[computers.length];
            
            for (int i = 0; i < parent.length; i++) {
                parent[i] = i;
            }
            
            /**
             * 연결관계에 있는 두 노드를 하나로 합치기
             */
            for (int i = 0; i < computers.length; i++) {
                for (int j = 0; j < computers[i].length; j++) {
                    if (computers[i][j] == 1) {
                        if (findParent(i) != findParent(j)) {
                            union(i, j);
                            answer--;
                        }
                    }
                }
            }
            return answer;
        }
    
        /**
         * 2. 자신의 부모 찾기
         */
        static int findParent(int x) {
            if (parent[x] != x) {
                return parent[x] = findParent(parent[x]);
            }
    
            return x;
        }
        /**
         * 3. 두 노드의 부모를 한 쪽의 부모로 맞추기
         */
        static void union(int a, int b) {
            a = findParent(a);
            b = findParent(b);
    
            if (a < b)
                parent[b] = a;
            else
                parent[a] = b;
        }
    
    }

    4.採点結果



    5.感じ

  • プログラマはこれをDFS/BFSに分割するが、ユニオン-Findによって解くこともできる.
  • コンビネーションセットは、通常、同様のモードで解決することができる.