λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“ μ•Œκ³ λ¦¬μ¦˜/Programmers

[C++/PGS] Lv.2 : μ „λ ₯망을 λ‘˜λ‘œ λ‚˜λˆ„κΈ° (완전탐색/bfs/dfs)

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

 

문제 μ„€λͺ…

n개의 솑전탑이 전선을 톡해 ν•˜λ‚˜μ˜ νŠΈλ¦¬ ν˜•νƒœλ‘œ μ—°κ²°λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 당신은 이 μ „μ„ λ“€ 쀑 ν•˜λ‚˜λ₯Ό λŠμ–΄μ„œ ν˜„μž¬μ˜ μ „λ ₯망 λ„€νŠΈμ›Œν¬λ₯Ό 2개둜 λΆ„ν• ν•˜λ €κ³  ν•©λ‹ˆλ‹€. μ΄λ•Œ, 두 μ „λ ₯망이 κ°–κ²Œ λ˜λŠ” μ†‘μ „νƒ‘μ˜ 개수λ₯Ό μ΅œλŒ€ν•œ λΉ„μŠ·ν•˜κ²Œ λ§žμΆ”κ³ μž ν•©λ‹ˆλ‹€.

μ†‘μ „νƒ‘μ˜ 개수 n, 그리고 μ „μ„  정보 wiresκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. μ „μ„ λ“€ 쀑 ν•˜λ‚˜λ₯Ό λŠμ–΄μ„œ 솑전탑 κ°œμˆ˜κ°€ κ°€λŠ₯ν•œ λΉ„μŠ·ν•˜λ„λ‘ 두 μ „λ ₯망으둜 λ‚˜λˆ„μ—ˆμ„ λ•Œ, 두 μ „λ ₯망이 가지고 μžˆλŠ” 솑전탑 개수의 차이(μ ˆλŒ€κ°’)λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­
  • n은 2 이상 100 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • wiresλŠ” 길이가 n-1인 μ •μˆ˜ν˜• 2차원 λ°°μ—΄μž…λ‹ˆλ‹€.
    • wires의 각 μ›μ†ŒλŠ” [v1, v2] 2개의 μžμ—°μˆ˜λ‘œ 이루어져 있으며, μ΄λŠ” μ „λ ₯망의 v1번 솑전탑과 v2번 솑전탑이 μ „μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
    • 1 ≤ v1 < v2 ≤ n μž…λ‹ˆλ‹€.
    • μ „λ ₯망 λ„€νŠΈμ›Œν¬κ°€ ν•˜λ‚˜μ˜ 트리 ν˜•νƒœκ°€ μ•„λ‹Œ κ²½μš°λŠ” μž…λ ₯으둜 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.

완탐 문제인데 dfs, bfs둜 ν’€ 수 μžˆλ‹€.

dfs둜 ν•˜λ €λ‹€κ°€ λ­”κ°€ 잘 μ•ˆλΌμ„œ bfs둜 ν–ˆμŒ 

 

 

λ‚˜μ˜ 풀이

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

int graph[101][101];
bool visited[101] = {0}; // λ…Έλ“œ λ°©λ¬Έ
int N;

int bfs(int j){
    queue<int> q;
    q.push(j);
    visited[j] = 1;
    int re = 1;
    while(!q.empty()){
        int a = q.front();
        q.pop();
        for(int i=1; i<=N; ++i){
            if(visited[i]==0 && graph[a][i]){
                q.push(i);
                visited[i] = 1;
                re++;
            }
        }
    }
    return re;
}

int solution(int n, vector<vector<int>> wires) {
    N = n;
    int answer = 101;
    
    for(int i=0; i<wires.size(); ++i){
        graph[wires[i][0]][wires[i][1]] = 1;
        graph[wires[i][1]][wires[i][0]] = 1;
    }
    
    for(int i=0; i<wires.size(); ++i){
        vector<int> v;
        fill(visited, visited+101, 0);
        int x = wires[i][0];
        int y = wires[i][1];
        graph[x][y] = 0;
        graph[y][x] = 0;
        for(int j=1; j<=N; ++j){
            int d=0;
            if(!visited[j]){
                d = bfs(j);
                // cout << d<<" - ";
                v.push_back(d);
            }
        }
        int a = abs(v[0] - v[1]);
        
        // cout << a <<"\n";
        if(answer > a) answer = a;
        if(answer == 0) break;
        graph[x][y] = 1;
        graph[y][x] = 1;
    }
    
    return answer;
}