그리 어렵지 않은 문제라고 느껴져서 금방 풀 줄 알았는데
wires로 인접 행렬을 만드는 부분에서 조금 시간이 걸렸다.
1. 인접 행렬 만들기
2. 선 하나씩 끊으면서 bfs 탐색
으로 로직이 간단하다.
최종 코드
import java.util.LinkedList;
import java.util.Queue;
class Solution {
static int[][] arr;
public int solution(int n, int[][] wires) {
int answer = Integer.MAX_VALUE;
// 인접 행렬 만들기
arr = new int[n + 1][n + 1];
for (int i = 0; i < wires.length; i++) {
arr[wires[i][0]][wires[i][1]] = 1;
arr[wires[i][1]][wires[i][0]] = 1;
}
// 선 하나씩 끊으면서 bfs 탐색
for (int i = 0; i < wires.length; i++) {
int left = wires[i][0];
int right = wires[i][1];
// 선 끊기
arr[left][right] = 0;
arr[right][left] = 0;
// bfs
answer = Math.min(answer, bfs(left, n));
// 끊었던 선 복구
arr[left][right] = 1;
arr[right][left] = 1;
}
return answer;
}
// bfs 메서드
static int bfs(int left, int n) {
int cnt = 1;
boolean[] visited = new boolean[n + 1];
Queue<Integer> queue = new LinkedList<>();
queue.add(left);
while (!queue.isEmpty()) {
int temp = queue.poll();
visited[temp] = true;
for (int i = 1; i < n + 1; i++) {
if (arr[temp][i] == 1 && !visited[i]) {
queue.add(i);
cnt++;
}
}
}
// cnt와 n - cnt는 각각 연결된 전력망
return Math.abs(cnt - (n - cnt));
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 백준 9935 - 문자열 폭발 (0) | 2022.07.28 |
---|---|
(Java) 백준 1991 - 트리 순회 (0) | 2022.07.28 |
(Java) 프로그래머스 - 후보키 (0) | 2022.07.26 |
(Java) 프로그래머스 - 모음사전 (0) | 2022.07.22 |
(Java) 백준 14502 - 연구소 (0) | 2022.07.22 |