-
프로그래머스 전력망을 둘로 나누기 C++프로그래머스(Programmers) 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; }
반응형'프로그래머스(Programmers)' 카테고리의 다른 글
괄호 회전하기 (0) 2022.05.18 프로그래머스 가장 먼 노드 C++ (0) 2022.05.17 프로그래머스 게임 맵 최단거리 C++ (2) 2022.04.24 프로그래머스 가장 먼 노드 C++ (0) 2022.04.22 프로그래머스 영어 끝말잇기 C++ (0) 2022.04.21