본문 바로가기

알고리즘 · 코딩

[프로그래머스] 전력망을 둘로 나누기

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/86971

 

코딩테스트 연습 - 전력망을 둘로 나누기

9 [[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]] 3 7 [[1,2],[2,7],[3,7],[3,4],[4,5],[6,7]] 1

programmers.co.kr


C++ 풀이

#include <string>
#include <vector>
using namespace std;

vector < vector<bool>> board;
int N;
int min_diff;

//연결된 송전탑 카운트
void DFS(int pos, int &cnt) {
    cnt++;
    for (int i = 1; i <= N; ++i) {
        if (board[pos][i] == true) {
            board[pos][i] = false;
            board[i][pos] = false;
            DFS(i, cnt);
            board[pos][i] = true;
            board[i][pos] = true;
        }  
    }
}

//두 송전탑 그룹 간의 개수 차이 계산
void getDiff(int a, int b) {
    int g1_cnt = 0, g2_cnt = 0;
    DFS(a, g1_cnt);
    DFS(b, g2_cnt);
    if (abs(g1_cnt - g2_cnt) < min_diff)
        min_diff = abs(g1_cnt - g2_cnt);
}

int solution(int n, vector<vector<int>> wires) {
    N = n;
    min_diff = n;
    board.resize(n + 1);
    for (int i = 0; i <= n; ++i) {
        for (int j = 0; j <= n; ++j)
            board[i].push_back(false);
    }

    for (int i = 0; i < wires.size(); ++i) {
        board[wires[i][0]][wires[i][1]] = true;
        board[wires[i][1]][wires[i][0]] = true;
    }

    //전선을 하나씩 끊어보며 송전탑 개수 차이 최소값 갱신
    for (int i = 0; i < wires.size(); ++i) {
        board[wires[i][0]][wires[i][1]] = false;
        board[wires[i][1]][wires[i][0]] = false;

        getDiff(wires[i][0], wires[i][1]);

        board[wires[i][0]][wires[i][1]] = true;
        board[wires[i][1]][wires[i][0]] = true;
    }

    return min_diff;
}

DFS로 풀이하였다.

 

 

 

 

반응형

'알고리즘 · 코딩' 카테고리의 다른 글

[SWEA 1954] 달팽이 숫자  (0) 2022.02.13
[프로그래머스] n^2 배열 자르기  (0) 2021.12.23
[백준 5620번] 가장 가까운 두 점의 거리  (0) 2021.11.06
[SWEA 1249] 보급로  (0) 2021.10.27
[SWEA 1230] 암호문3  (0) 2021.10.27