알고리즘/문제풀이

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

LIRI 2025. 5. 4. 20:55

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

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제 분석

조건

  • 하나의 트리형 전력망이 있다 (노드 + 간선)
  • 전선을 하나 끊어서 두 개의 네트워크로 나눌 수 있는데 이때 두 네트워크의 노드 수 차이를 최소로 만들어 차이를 출력

풀이방법

  • 트리를 입력받은 후 간선마다 돌아가며 DFS를 수행하면 된다.
  • 하나의 트리로 연결되어있고, 전체 노드의 수를 알고 있으므로 간선의 두 노드 중 하나에서만 DFS를 돌리면 나머지 네트워크의 노드 수도 알 수 있다.

코드

import java.util.*;

class Solution {
    static List<Integer>[] tree;
    static boolean[] visited;

    public int solution(int n, int[][] wires) {
        int answer = 101;
        tree = new List[n + 1];
        for (int i = 1; i <= n; i++) {
            tree[i] = new ArrayList<>();
        }
        for (int[] wire : wires) {
            tree[wire[0]].add(wire[1]);
            tree[wire[1]].add(wire[0]);
        }
        visited = new boolean[n + 1];
        for (int[] wire : wires) {
            Arrays.fill(visited, false);
            visited[wire[0]] = true;
            visited[wire[1]] = true;
            answer = Math.min(Math.abs(dfs(wire[0]) * 2 - n), answer);
            if (answer == 0) {
                break;
            }
        }
        return answer;
    }

    private int dfs(int now) {
        int count = 1;
        for (Integer next : tree[now]) {
            if (visited[next]) {
                continue;
            }
            visited[next] = true;
            count += dfs(next);
        }
        return count;
    }
}
728x90