본문 바로가기
Beakjoon&프로그래머스/Java

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

by 현장 2026. 1. 14.

-Code

import java.util.*;

class Solution {
    public int solution(int n, int[][] wires) {
        int answer = Integer.MAX_VALUE;
        // 노드 저장을 위한 리스트
        ArrayList<ArrayList<Integer>> nodes = new ArrayList<>();
        // 초기화
        for (int i = 0; i <= n; i++) nodes.add(new ArrayList<>());
        // 셋팅
        for (int[] wire : wires) {
            int u = wire[0];
            int v = wire[1];
            // 양방향 맵핑
            nodes.get(u).add(v);
            nodes.get(v).add(u);
        }
        // 연결을 하나씩 지우고 검사
        for (int[] wire : wires) {
            int u = wire[0];
            int v = wire[1];
            // visited
            boolean[] visited = new boolean[n + 1];
            // 현재 연결 끊기
            nodes.get(u).remove((Integer) v);
            nodes.get(v).remove((Integer) u);
            // 갯수 구하기
            int cnt = DFS(u, visited, nodes);
            // 다시 연결
            nodes.get(u).add(v);
            nodes.get(v).add(u);
            // 비슷한 갯수구하기
            answer = Math.min(answer, Math.abs(n - cnt * 2));
        }
        return answer;
    }
    // dfs
    private static int DFS(
        int node, 
        boolean[] visited, 
        ArrayList<ArrayList<Integer>> nodes
    ) {
        visited[node] = true;
        // 총 연결 갯수를 얻기 위한 변수
        int totalCount = 1;
        
        for (int next : nodes.get(node)) {
            if (!visited[next]) {
                // 연결 갯수없으면 1을 반환하며 올라가 총 갯수 더해줌
                totalCount += DFS(next, visited, nodes);
            }
        }
        return totalCount;
    }
}

완전 탐색이라 와이어의 연결을 하나씩 빼는 것은 알았지만 그걸 뭘로 구현하지 생각을 많이 했었습니다. ArrayList를 쓰기는 하는데 제거후 다시 넣는 방법을 안써봐서 몰랐는데 알고보니 remove라는 메소드가 있었고 추가로 Object로 입력을 안해주면 index에 위치하는 값이 삭제되어서 해당 부분을 Integer로 바꾸어 해결했습니다.