문제 : [프로그래머스] 전력망을 둘로 나누기 💡
난이도 : LEVEL 2
1️⃣ n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있다.
2️⃣ 이 전선들 중 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할하려고 한다.
3️⃣이때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞추고자 한다.
그림 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/86971
- 송전탑 연결에 대한 정보를 인접 리스트 형태의 그래프로 입력받는다.
- 하나씩 연결을 끊고 연결을 끊은 2개의 노드를 기준으로 DFS를 사용하여 각각의 네트워크 당 송전탑의 개수를 센다.
- 각각의 네트워크의 송전탑의 개수의 차이 절대값이 최소값인지 확인하며 위의 과정을 반복한다.
for(int i=0; i<wires.size(); i++){
int first = wires[i][0];
int second = wires[i][1];
graph[first].push_back(second);
graph[second].push_back(first);
}
int first = wires[i][0]; int second = wires[i][1];
//전선 연결 끊기
graph[first].erase(graph[first].begin());
graph[second].erase(graph[second].begin());
...
//전선 연결 원상 복구
graph[first].push_back(second);
graph[second].push_back(first);
}
memset(check,false,101); //전선 연결 원상 복구
int first = wires[i][0]; int second = wires[i][1];
check[first] = true; check[second] = true; //전선 연결 끊기
int dfs(int here, int cnt){
check[here] = 1;
for(int i=0; i<graph[here].size(); i++){
int next = graph[here][i];
if(check[next] == 0){
cnt = dfs(next, cnt+1); //cnt : 연결된 송전탑의 개수
}
}
return cnt;
}
...
for(int i=0; i<wires.size(); i++){
memset(check,false,101); //전선 연결 원상 복구
int first = wires[i][0]; int second = wires[i][1];
check[first] = true; check[second] = true; //전선 연결 끊기
int var1 = dfs(first, 0); int var2 = dfs(second, 0);
answer = min(abs(var1-var2), answer);
}
#include <string.h>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
vector<int> graph[101];
bool check[101];
int num1 = 0;
int dfs(int here, int cnt){
check[here] = 1;
for(int i=0; i<graph[here].size(); i++){
int next = graph[here][i];
if(check[next] == 0){
cnt = dfs(next, cnt+1);
}
}
return cnt;
}
int solution(int n, vector<vector<int>> wires) {
int answer = 100;
for(int i=0; i<wires.size(); i++){
int first = wires[i][0]; int second = wires[i][1];
graph[first].push_back(second);
graph[second].push_back(first);
}
for(int i=0; i<wires.size(); i++){
memset(check,false,101);
int first = wires[i][0]; int second = wires[i][1];
check[first] = true; check[second] = true; //전선 연결 끊기
int var1 = dfs(first, 0); int var2 = dfs(second, 0);
answer = min(abs(var1-var2), answer);
}
return answer;
}