Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Archives
Today
Total
관리 메뉴

csct3434

[level 2] 전력망을 둘로 나누기 - 86971 본문

프로그래머스

[level 2] 전력망을 둘로 나누기 - 86971

csct3434 2024. 2. 29. 03:28

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

class Solution {

    public int solution(int n, int[][] wires) {
        int answer = n;

        int[] count = new int[n + 1];
        boolean[] visited = new boolean[n + 1];
        boolean[][] adjacentMatrix = new boolean[n + 1][n + 1];

        initAdjacentMatrix(adjacentMatrix, wires);

        dfs(n, 1, count, visited, adjacentMatrix);

        for (int[] wire : wires) {
            int subsetCount = Math.min(count[wire[0]], count[wire[1]]);
            answer = Math.min(answer, Math.abs(subsetCount - (n - subsetCount)));
        }

        return answer;
    }

    private void initAdjacentMatrix(boolean[][] adjacentMatrix, int[][] wires) {
        for (int[] wire : wires) {
            adjacentMatrix[wire[0]][wire[1]] = true;
            adjacentMatrix[wire[1]][wire[0]] = true;
        }
    }

    private int dfs(int n, int node, int[] count, boolean[] visited, boolean[][] adjacentMatrix) {
        visited[node] = true;

        int childCount = 0;
        for (int i = 1; i <= n; i++) {
            if (adjacentMatrix[node][i] && !visited[i]) {
                childCount += dfs(n, i, count, visited, adjacentMatrix);
            }
        }

        return count[node] = childCount + 1;
    }
}