๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš“ Self Study/๐Ÿ”“ Programmers

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ, ๊ทธ๋ž˜ํ”„) C++

by UKHYUN22 2021. 12. 29.
728x90

 

๊ทธ๋ž˜ํ”„์™€ DFS์˜ ๋Š๋‚Œ์ด ํ’๊ธด๋‹ค๋ฉด ์ด์ค‘ ๋ฒกํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ Adjacent List๋ฅผ ๋งŒ๋“ค๊ณ  visited ๋ฒกํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ BFS๋ฅผ iterativeํ•˜๊ฒŒ ๊ตฌ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  BFS์˜ ๊ฒฝ์šฐ ์‹œ์ž‘ ๋…ธ๋“œ์™€ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€๋Š” ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ค˜์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. while ๋ฌธ ์•ˆ์˜ for ๋ฌธ์˜ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ node๋ฅผ ์„ค์ •ํ•ด๋†“๊ณ  ๊ทธ ์ฃผ๋ณ€ ์—ฐ๊ฒฐ๋œ node๋งŒ์„ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ์— queue์—์„œ front๋กœ ์ฐธ์กฐํ•œ node๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์„ฑ์งˆ์„ ์ด์šฉํ•˜์—ฌ level์„ ์ฒดํฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

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

using namespace std;

int solution(int n, vector<vector<int>> edge) {
    int answer = 0;
    vector<vector<int>> graph(n+1);
    vector<bool> visited(n+1, false);
    vector<int> counts(n+1,0);
    queue<int> queue;
    
    // Adjacent List๋ฅผ ๋งŒ๋“ ๋‹ค. 2์ค‘ ๋ฒกํ„ฐ๋ฅผ ํ™œ์šฉ
    // ๋ฐฉํ–ฅ์„œ์ž‰ ์—†์œผ๋ฏ€๋กœ ์–‘์ชฝ ๋‘˜๋‹ค ๋„ฃ์–ด์ค€๋‹ค.
    for(int i = 0 ; i < edge.size() ; i++) {
        graph[edge[i][0]].push_back(edge[i][1]);
        graph[edge[i][1]].push_back(edge[i][0]);
    }
    
    // 1์—์„œ ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ 1์„ ๋จผ์ € ๋„ฃ๋Š”๋‹ค.
    queue.push(1);
    visited[1] = true;
    
    // queue์— ์–ด๋–ค ๊ฒƒ์ด ๋“ค์–ด์žˆ๊ธฐ๋งŒ ํ•˜๋ฉด ๊ณ„์† ๋ฐ˜๋ณตํ•œ๋‹ค.
    while(!queue.empty()) {
        
        // queue์˜ front์˜ ์š”์†Œ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.
        int node = queue.front();
        queue.pop();
        
        // front ์š”์†Œ์˜ ์ฃผ๋ณ€ node๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋ณต๋ฌธ์„ ๊ตฌ์„ฑ
        for(int i = 0 ; i < graph[node].size() ; i++) {
            
            // ๋งŒ์•ฝ front๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
            if(!visited[graph[node][i]]) {
                
                // currentCount ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด +1 ์„ ํ•ด์ค€๋‹ค.
                // 1์—์„œ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ์žˆ๋Š”์ง€๋ฅผ indexํ™” ์‹œ์ผœ ๋น„๊ตํ•œ๋‹ค.
                int currentCount = counts[node] + 1;
                visited[graph[node][i]] = true;
                
                // ๋ฐฉ๋ฌธํ•œ node์— ํ•ด๋‹นํ•˜๋Š” index์˜ level์„ ๋ถ€์—ฌํ•œ๋‹ค.
                counts[graph[node][i]] = currentCount;
                
                // ํ•ด๋‹น node๋ฅผ queue์— push ํ•ด์ค€๋‹ค.
                queue.push(graph[node][i]);
            }
        }
    }
    
    // counts ๋ฐฐ์—ด์„ begin๋ถ€ํ„ฐ end๊นŒ์ง€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ sort ์‹œํ‚จ๋‹ค.
    sort(counts.begin(), counts.end(), greater<int>());
    
    // ๋งŒ์•ฝ count์˜ ๊ฐ€์žฅ ํฐ ์š”์†Œ์™€ ๊ฐ™์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋‚˜์˜จ๋‹ค๋ฉด level์ด ๋‚ฎ์•„์ง„ ๊ฒƒ์ด๋ฏ€๋กœ
    // ํ•ด๋‹น ์กฐ๊ฑด์˜ ๊ฒฝ์šฐ break ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด answer๋ฅผ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
    for(auto cnt : counts) {
        if(cnt != counts[0]) break;
        answer++;
    }
    
    return answer;
}