티스토리 뷰

 

#include <string>
#include <vector>
#include <climits>
#include <cmath>
#include <cstring> 

using namespace std;

vector<int> v[101];
bool visited[101];

int dfs(int cur) 
{
    visited[cur] = 1;
    int cnt = 1; //카운팅

    for (int next : v[cur]) 
    {
        if (visited[next]) continue;
        cnt += dfs(next);
    }

    return cnt;
}

int solution(int n, vector<vector<int>> wires) {
    int answer = INT_MAX;

    for (auto wire : wires) 
    {
        v[wire[0]].push_back(wire[1]);
        v[wire[1]].push_back(wire[0]);
    }

    for (auto wire : wires) 
    {
        memset(visited, false, sizeof(visited)); // 방문 배열 초기화

        visited[wire[1]] = true; // 한쪽을 방문체크
        int cnt = dfs(wire[0]);  // 나머지 한쪽에서 카운팅
        int diff = abs(n - 2 * cnt); // 두 그룹의 차이 계산
        answer = min(answer, diff);
    }

    return answer;
}

 

dfs나 bfs 알고리즘을 통해 전부 탐색하면서 카운팅을 해주는 문제이다.

우선 양방향으로 연결된 값을 각 방향에 넣어주고 시작한다.

 

이후 방문 배열을 이용해 한쪽은 방문 체크하고 나머지 방향을 기준으로 카운팅을 시작한다.

이를 모든 위치에 대해서 시행하며 카운팅한 값을 토대로 그룹 간 차이가 가장 적은 값을 탐색한다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함