개발/알고리즘

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

Majangnan 2025. 5. 6. 17:33

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

코드 구현

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<vector<int>> tree;
vector<bool> visited;
int nodeCount = 0;

void dfs(int node)
{
    nodeCount++;

    for (const auto& neighbor : tree[node])
    {
        if (!visited[neighbor])
        {
            visited[neighbor] = true;
            dfs(neighbor);
            visited[neighbor] = false;
        }
    }

    return;
}

int solution(int n, vector<vector<int>> wires) 
{
    tree.resize(n + 1);
    visited.resize(n + 1);

    int answer = 100;

    for (int i = 0; i < wires.size(); i++)
    {
        int node = wires[i][0];
        int neighbor = wires[i][1];
        tree[node].push_back(neighbor);
        tree[neighbor].push_back(node);
    }

    for (const auto& wire : wires)
    {
        int node1 = wire[0];
        int node2 = wire[1];

        // 연결 삭제
        tree[node1].erase(remove(tree[node1].begin(), tree[node1].end(), node2));
        tree[node2].erase(remove(tree[node2].begin(), tree[node2].end(), node1));

        // 노드 개수 세기
        nodeCount = 0;
        visited[1] = true;
        dfs(1);
        visited[1] = false;

        int diff = n - nodeCount;

        if (diff > nodeCount) diff -= nodeCount;
        else diff = nodeCount - diff;

        answer = min(answer, diff);

        // 연결 복구
        tree[node1].push_back(node2);
        tree[node2].push_back(node1);
    }


    return answer;
}

 

 

해결 방법

dfs를 이용하여 1번 노드부터 순회를 하여 연결된 지점까지의 개수를 전체 개수에서 빼면 다른 지점의 개수를 구할 수 있다. wire에 들어있는 노드 정보를 통해 하나씩 노드 연결을 끊고 노드 개수를 구하고 다시 연결을 복구시킨다.