| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- 이분탐색
- 백준
- kotlin
- c++
- 우선순위큐
- 다이나믹 프로그래밍
- level3
- 통신 인터페이스
- C
- 코틀린
- JavaScript
- 2018 KAKAO BLIND RECRUITMENT
- cpp
- 자바
- 구현
- BFS
- 임베디드
- 그리디
- 다이나믹프로그래밍
- level2
- 프로그래머스
- 누적합
- 컴퓨터 비전
- Stack
- 컴퓨터비전
- dp
- lv2
- dfs
- java
- 동적계획법
Archives
- Today
- Total
코드를 느껴바라
Lv.2 전력망을 둘로 나누기 [JAVA] 본문
문제 풀이
성공 여부(걸린 시간): 성공(27분 40초)
아이디어
연결된 엣지를 하나씩 끊어보며 양 전력망의 개수를 구한다.
그다음 해당 개수를 result 리스트에 넣고 탐색을 마쳤을 때
전력망이 두개라면 두 전력망의 개수의 차이를 구한다.
간단히 말하면 각 엣지가 끊어진 경우마다 비교해서 최소의 차이의 절대값을 구한다 이다.
백준에 있는 이장선거? 개리멘더링? 그거랑 비슷한 문제인듯
풀이 코드
import java.util.*;
class Solution {
static ArrayList<ArrayList<Integer>> graph;
static boolean [] visited;
public int solution(int n, int[][] wires) {
int answer = Integer.MAX_VALUE;
graph = new ArrayList<>();
for(int i=0; i<=n; i++){
graph.add(new ArrayList<>());
}
// 그래프 연결
for(int [] wire: wires){
graph.get(wire[0]).add(wire[1]);
graph.get(wire[1]).add(wire[0]);
}
//하나씩 끊어보기
for(int [] wire: wires){
visited = new boolean[n+1];
List<Integer> result = new ArrayList<>();
for(int i=1; i<=n; i++){
if(!visited[i]){
int count = BFS(i, wire);
result.add(count);
}
}
if(result.size()==2){
answer= Math.min(Math.abs(result.get(0)-result.get(1)), answer);
}
}
return answer;
}
static int BFS(int start, int [] wire){
ArrayDeque<Integer> q = new ArrayDeque<>();
q.add(start);
visited[start] = true;
int count = 0;
while(!q.isEmpty()){
int cur = q.poll();
count++;
for(int x: graph.get(cur)){
if(!visited[x]&&!(cur==wire[0] && x==wire[1])&&!(cur==wire[1] && x==wire[0])){
visited[x] = true;
q.add(x);
}
}
}
return count;
}
}반응형
'PS > 프로그래머스(Programmers)' 카테고리의 다른 글
| Lv.3 산 모양 타일링 [JAVA] (0) | 2025.09.05 |
|---|---|
| Lv.2 마법의 엘리베이터 [JAVA] (3) | 2025.08.26 |
| Lv.2 롤케이크 자르기 [JAVA] (4) | 2025.08.17 |
| Lv.3 등대 [JAVA] (5) | 2025.08.02 |
| Lv.2 미로 탈출 [JAVA] (3) | 2025.07.31 |
