프로그래머스(Programmers)
프로그래머스 전력망을 둘로 나누기 C++
cosmohoo
2022. 4. 25. 20:58
반응형
제한사항
- n은 2 이상 100 이하인 자연수입니다.
- wires는 길이가 n-1인 정수형 2차원 배열입니다.
- wires의 각 원소는 [v1, v2] 2개의 자연수로 이루어져 있으며, 이는 전력망의 v1번 송전탑과 v2번 송전탑이 전선으로 연결되어 있다는 것을 의미합니다.
- 1 ≤ v1 < v2 ≤ n 입니다.
- 전력망 네트워크가 하나의 트리 형태가 아닌 경우는 입력으로 주어지지 않습니다.
입출력 예
nwiresresult
9 | [[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]] | 3 |
4 | [[1,2],[2,3],[3,4]] | 0 |
7 | [[1,2],[2,7],[3,7],[3,4],[4,5],[6,7]] | 1 |
입출력 예 #1
- 다음 그림은 주어진 입력을 해결하는 방법 중 하나를 나타낸 것입니다.
- 4번과 7번을 연결하는 전선을 끊으면 두 전력망은 각 6개와 3개의 송전탑을 가지며, 이보다 더 비슷한 개수로 전력망을 나눌 수 없습니다.
- 또 다른 방법으로는 3번과 4번을 연결하는 전선을 끊어도 최선의 정답을 도출할 수 있습니다.
입출력 예 #2
- 다음 그림은 주어진 입력을 해결하는 방법을 나타낸 것입니다.
- 2번과 3번을 연결하는 전선을 끊으면 두 전력망이 모두 2개의 송전탑을 가지게 되며, 이 방법이 최선입니다.
입출력 예 #3
- 다음 그림은 주어진 입력을 해결하는 방법을 나타낸 것입니다.
- 3번과 7번을 연결하는 전선을 끊으면 두 전력망이 각각 4개와 3개의 송전탑을 가지게 되며, 이 방법이 최선입니다.
=> DFS문제입니다.
=> 주어진 wires를 이용해서 이어진 간선들을 표현하여야합니다.
=> 그 이후 각 간선들을 하나씩 지워가며 각 연결망이 몇개의 정점으로 이루어져있는지 탐색합니다.
=> 이때, DFS를 사용하여 탐색을 할 수 있습니다.
=> 두 연결망이 각각 몇개의 정점으로 이루어져 있는지 파악한뒤, 두개의 차이값을 구합니다.
=> 해당값의 절대값을 구합니다.
=> 위 값의 절대값들 중 가장 작은 값을 구합니다.
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#define MAX 101
using namespace std;
int graph[MAX][MAX] = {0}; //wires값을 입력받을 이차원 배열
vector<bool> visited; //갔다온지 확인하는 배열
int dfs(int cur, int n)
{
if(visited[cur]) return 0;
int ret=1;
visited[cur] = true;
for(int i=1; i<=n; i++)
{
if(graph[cur][i]) //연결되어있으며, 가본적 없는 곳인 경우
{
ret += dfs(i, n);
}
}
return ret;
}
int solution(int n, vector<vector<int>> wires) {
int answer = 102;
//초기화
for(int i=0; i<wires.size(); i++)
{
int x = wires[i][0];
int y = wires[i][1];
graph[x][y] = 1;
graph[y][x] = 1;
}
for(int i=0; i<wires.size(); i++)
{
int x = wires[i][0];
int y = wires[i][1];
graph[x][y] = graph[y][x] = 0;
visited = vector<bool> (n+1,false);
vector<int> diff ;
for(int i=1; i<=n; i++)
{
int tmp = dfs(i,n);
if(!tmp)continue;
diff.push_back(tmp);
}
answer = min(answer, abs(diff[0]-diff[1]));
if (answer == 0)break;
graph[x][y] = graph[y][x] = 1;
}
return answer;
}
반응형