Seren dev's blog
article thumbnail

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 풀이

인접리스트로 그래프를 생성한 후, 완전탐색을 사용하여, 각 전선이 끊어진 경우의 두 전력망의 송전탑 개수의 차이를 구한다.

하나의 전력망의 송전탑 개수BFS를 사용하여 구한다.

2. 코드

<java />
import java.util.*; class Solution { public int solution(int n, int[][] wires) { // 인접리스트로 그래프 생성 LinkedList<Integer>[] graph = new LinkedList[n+1]; for (int i = 1; i <= n; i++) { graph[i] = new LinkedList<>(); } for (int[] wire: wires) { graph[wire[0]].add(wire[1]); graph[wire[1]].add(wire[0]); } int minDiff = Integer.MAX_VALUE; for (int[] wire: wires) { // 선 끊기 // Integer로 감싸지 않으면 index로 인식함 graph[wire[0]].remove(new Integer(wire[1])); graph[wire[1]].remove(new Integer(wire[0])); // BFS로 하나의 전력망의 송전탑 개수 구하기 int cnt = bfs(wire[0], graph, n); // cnt - (n-cnt) minDiff = Math.min(minDiff, Math.abs(2 * cnt - n)); // 0이면 더 이상 탐색할 필요가 없다 if (minDiff == 0) break; // 선 다시 복구 graph[wire[0]].add(wire[1]); graph[wire[1]].add(wire[0]); } return minDiff; } public static int bfs(int start, LinkedList<Integer>[] graph, int n) { boolean[] visited = new boolean[n+1]; Queue<Integer> q = new LinkedList<>(); q.add(start); visited[start] = true; int cnt = 0; while (!q.isEmpty()) { int cur = q.poll(); cnt++; for (int next: graph[cur]) { if (!visited[next]) { q.add(next); visited[next] = true; } } } return cnt; } }
하나의 전력망의 송전탑 개수를 구하면, 나머지 송전탑 개수는 n - cnt이므로 BFS를 두 번 할 필요가 없다.

 

728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!