ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 전력망을 둘로 나누기 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;
    }

     

     

    반응형

    댓글

Designed by Who.