[プログラマー]電力網を二つに分ける

11203 ワード

質問する


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

アルゴリズム#アルゴリズム#


bfs

に答える


制限事項を見るとタイムアウトできないので完全に解けるのですが、時間がかかりすぎたようです.
  • の電力網を切断するたびに、2つの電力網の違いの絶対値を返し、最小を答えとします.
  • 電力網は二つに分かれており、一つの電力網の数を知るだけで、残りはn-一つの電力網であるため、回線選択電力網の0,1インデックスの中で一つしか選択されていない.
  • は、選択した電力網のインデックスを持って、電力網全体を巡視し、親、子の位置にあるかどうかを確認します.
  • は、最初に選択した電力網をキューに3回入れ、親または子供の位置であればキューに入れてカウントを増やす.
  • でチェックされた電力網はキューから削除され、チェックされた電線のインデックスでアクセスタグが付けられます.
  • をチェックした後、カウントとnカウントの差の絶対値を返します.
  • 6回の最小値を求めると、答えは正解です.
  • コード#コード#

    import java.util.LinkedList;
    import java.util.Queue;
    
    class Solution {
        public int solution(int n, int[][] wires) {
            int answer = Integer.MAX_VALUE;
    
    		// 전체 전력망을 돌면서 두 전력망의 차이를 구한다.
            for (int i = 0; i < wires.length; i++) {
                answer = Math.min(answer, bfs(n, i, wires));
            }
    
            return answer;
        }
    
        public int bfs(int n, int index, int[][] wires) {
            int[] visit = new int[n];
            Queue<Integer> q = new LinkedList<>();
    
            visit[index] = 1;
            int cnt = 1;
    
    		// 차단할 전력망의 0, 1 중에 하나의 전력망 개수만 구해준다.
            q.offer(wires[index][1]);
    
            while (!q.isEmpty()) {
            
            	// 큐에서 하나 빼준다.
                Integer pointer = q.poll();
    
                for (int i = 0; i < n - 1; i++) {
                
                	// 방문하지 않았는지 체크
                    if (visit[i] == 0) {
                    
                    	// 부모자리의 값과 포인터 값이 같은지 확인한다.
                        // 만약 같으면 해당 자리의 반대편 값을 큐에 넣어준다.
                        if (wires[i][0] == pointer) {
                            q.offer(wires[i][1]);
                            visit[i] = 1;
                            cnt++;
                        }
    
    					// 자식자리의 값과 포인터 값이 같은지 확인한다.
                        // 만약 같으면 해당 자리의 반대편 값을 큐에 넣어준다.
                        if (wires[i][1] == pointer) {
                            q.offer(wires[i][0]);
                            visit[i] = 1;
                            cnt++;
                        }
                    }
                }
            }
    
    		// 둘로 나눈 전력망의 차이의 절대값을 리턴해준다.
            return Math.abs(cnt - (n - cnt));
        }
    }