전력망을 둘로 나누기


프로그래머스 [전력망을 둘로 나누기]

문제보기
Alt text

소스코드

import java.util.ArrayDeque;
import java.util.Deque;

class Solution {
    private static int answer;
    private static boolean[][] map;

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

        map = new boolean[n + 1][n + 1];

        // 송신탑 연결정보 세팅
        for (int i = 0; i < wires.length; i++) {
            int[] wire = wires[i];
            map[wire[0]][wire[1]] = true;
            map[wire[1]][wire[0]] = true;
        }

        // 네트워크 분리 시도
        for (int i = 0; i < wires.length; i++) {
            int[] wire = wires[i];

            Deque<Integer> stack = new ArrayDeque<>();
            stack.add(wire[0]);

            boolean[] topStatus = new boolean[map.length];
            topStatus[wire[0]] = true;

            int cnt = findInNetwork(wire, stack, topStatus, 1);

            int diff = Math.abs((n - cnt) - cnt);
            answer = answer < 0 ? diff : Math.min(diff, answer);
        }


        return answer;
    }

    private static int findInNetwork(int[] cutWire, Deque<Integer> stack, boolean[] topStatus, int cnt) {
        int currentTopNum = stack.pop();

        for (int i = 1; i < map.length; i++) {
            if (i != cutWire[1] && map[currentTopNum][i] && !topStatus[i]) {
                topStatus[i] = true;
                stack.add(i);
                cnt = findInNetwork(cutWire, stack, topStatus, cnt + 1);
            }
        }

        return cnt;
    }
}