프로그래머스(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;
}

 

 

반응형