[프로그래머스] 전력망을 둘로 나누기 (Java)
https://school.programmers.co.kr/learn/courses/30/lessons/86971
입력 : 송전탑의 개수 n, 전선 정보가 담긴 정수 2차원 배열 wires
출력 : 두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)
O(n^2)
BFS
구현
import java.util.*;
class Solution {
public int solution(int n, int[][] wires) {
int answer = n;
// 그래프를 인접 리스트로 표현
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i < n + 1; i++) {
graph.add(new ArrayList<>());
}
// 간선 정보를 인접 리스트에 추가
for (int[] wire : wires) {
int u = wire[0];
int v = wire[1];
graph.get(u).add(v);
graph.get(v).add(u);
}
// 각 간선을 하나씩 끊어보며 최소 차이를 계산
for (int[] wire : wires) {
int u = wire[0];
int v = wire[1];
// 간선을 끊음
graph.get(u).remove((Integer) v);
graph.get(v).remove((Integer) u);
// BFS나 DFS로 한쪽 네트워크의 크기 계산
int count = bfs(graph, n, u);
// 두 네트워크 크기의 차이 계산
int diff = Math.abs(n - 2 * count);
answer = Math.min(answer, diff);
// 끊었던 간선 다시 복구
graph.get(u).add(v);
graph.get(v).add(u);
}
return answer;
}
// BFS를 이용하여 한쪽 네트워크의 노드 수 계산
private int bfs(List<List<Integer>> graph, int n, int start) {
boolean[] visited = new boolean[n + 1];
Queue<Integer> queue = new LinkedList<>();
queue.add(start);
visited[start] = true;
int count = 0;
while (!queue.isEmpty()) {
int node = queue.poll();
count++;
for (int neighbor : graph.get(node)) {
if (!visited[neighbor]) {
visited[neighbor] = true;
queue.add(neighbor);
}
}
}
return count;
}
}