[c++] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค :: ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ (๋ฌธ์ œ ํ’€์ด, ์ฝ”๋“œ)

๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ

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

 

์ฝ”๋“œ

#include <string>
#include <vector>
#include <set>
#include <queue>
#include <map>

using namespace std;

int solution(int n, vector<vector<int>> edge) {
    int answer = 0;
    map<int, vector<int>> linked_list;
    set<int> list;
    list.insert(1);

    // ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ
    int size = edge.size();
    for(int i=0; i<size; i++){
        int first = edge[i][0];
        int second = edge[i][1];
        linked_list[first].push_back(second);
        linked_list[second].push_back(first);
    }

    queue<int> q; q.push(1);
    int q_size;
    while(list.size()!=n){
        q_size = q.size();
        for(int i=0; i<q_size; i++){
            int key = q.front(); q.pop();
            vector<int> tmp = linked_list[key];

            int size = tmp.size();
            for(int i=0; i<size; i++){
                auto ret = list.insert(tmp[i]);
                if(ret.second!=false)
                    q.push(tmp[i]);
            }
        }
    }
    answer = q.size();

    return answer;
}

 

์„ค๋ช…

 ์šฐ์„  ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๋‹ˆ๊นŒ ๋ฐฐ์—ด๋กœ ํ’€์ง€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ํ’€์ง€๋ฅผ ์ƒ๊ฐํ–ˆ๋‹ค. ๋ฐฐ์—ด๋กœ ํ’€๊ฒŒ ๋˜๋ฉด ๋ฐฐ์—ด์˜ ๊ณฑ์„ ๊ตฌํ•ด์„œ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ๋ฐฐ์—ด์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ๊ณต๊ฐ„์„ ๋งŽ์ด ์ฐจ์ง€ํ•˜๊ฒŒ ๋˜๊ณ  ๋ฐฐ์—ด์˜ ๊ณฑ ๊ณ„์‚ฐ์€ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ํฐ ๊ณ„์‚ฐ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜ n์ด 20,000์ดํ•˜๋ผ๋Š” ์กฐ๊ฑด์—์„œ ํ•˜๋‚˜์˜ 2์ฐจ์› ๋ฐฐ์—ด์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด 4x10^8์˜ ๊ณต๊ฐ„์ด ํ•„์š”ํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ , 2์ฐจ์› ๋ฐฐ์—ด 2๊ฐœ๋ฅผ ๊ณฑํ•˜๋ ค๋ฉด 10^17 ์ •๋„์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์†Œ์š”๋œ๋‹ค. ๋ณดํ†ต ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ 10^9 ์ดํ•˜๋กœ ์žก๋Š”๋ฐ์— ๋ฐ˜ํ•˜์—ฌ ์ด๋Š” ๊ต‰์žฅํžˆ ๋†’์€ ์ˆ˜์ด๋ฏ€๋กœ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ํ‘œํ˜„๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•œ๋‹ค.

 

map<int, vector<int>> linked_list;

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ตฌํ˜„ํ•ด๋„ ๋˜์ง€๋งŒ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ STL์—์„œ ์ง€์›ํ•˜๋Š” map์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•œ๋‹ค. key ๊ฐ’์œผ๋กœ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ฃผ๊ณ , value ๊ฐ’์œผ๋กœ ํ•ด๋‹น ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ ๋ฐฐ์—ด์ธ vector ๊ฐ’์„ ์ฃผ๋ฉด ์†์‰ฝ๊ฒŒ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

set<int> list;
list.insert(1);

๊ทธ ํ›„, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๋”ฐ๋ผ์„œ 1๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ์ฒดํฌํ•˜๋ฉด์„œ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์ฒดํฌ๋  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰ํ•ด์•ผํ•œ๋‹ค. ์ด ๋•Œ, ๋ชจ๋“  ๋…ธ๋“œ์— ๋“ค๋ €๋Š”์ง€ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋น„ํŠธ๋งˆ์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , vector์™€ ๊ฐ™์€ ๋ฐฐ์—ด์— ํ‘œ์‹œํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋น„ํŠธ ๋งˆ์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” n์˜ ๋ฒ”์œ„๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๊ฐ๋‹น ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒํ˜•์ด ์—†๊ณ , vector๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์›์†Œ๊ฐ€ ์ด๋ฏธ ๋“ค๋ €๋˜ ์›์†Œ์ธ์ง€๋ฅผ ์ฐพ๋Š” ๋ฐ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค. ๋”ฐ๋ผ์„œ STL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ set์„ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ๊นŒ์ง€ ๋“ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์ฒดํฌํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

 

 

 while(list.size()!=n){
        q_size = q.size();
        for(int i=0; i<q_size; i++){
            // queue์— ์žˆ๋Š” ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌ
        }
 }

 ์ฝ”๋“œ ๊ตฌํ˜„ ์‹œ ์ฃผ์˜ํ•ด์•ผํ•  ์ ์€ ๋…ธ๋“œ๋“ค์„ BFS์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ˆœํšŒํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. BFS๋Š” ํ•œ๋ฒˆ์˜ ์ˆœํšŒ์˜ ๊ธฐ์ค€์ด ์—†์ด queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด n๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์ˆœํšŒํ•œ ์ˆœ๊ฐ„ ์–ด๋–ค ๋…ธ๋“œ๋“ค์ด ๋งˆ์ง€๋ง‰ ์ˆœํšŒ์— ํฌํ•จ๋˜์–ด์žˆ์—ˆ๋Š” ์ง€๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๋”ฐ๋ผ์„œ while ๋‚ด์˜ for๋ฌธ์œผ๋กœ ๋‹จ๊ณ„๋ฅผ ๋‚˜๋ˆ ๋‘์—ˆ๋‹ค.

 

 ์™ผ์ชฝ BFS ๊ทธ๋ฆผ์—์„œ๋Š” 1๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ 2, 3๋ฒˆ ๋…ธ๋“œ๋ฅผ queue์— ๋„ฃ์€ ํ›„ 2๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ 5๋ฒˆ ๋…ธ๋“œ๋ฅผ queue์— ๋„ฃ๋Š” ๊ณผ์ •์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด 3๋ฒˆ์€ 1๋ฒˆ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ํ•œ ๋ฒˆ์˜ ์—ฐ๊ฒฐ๋กœ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๊ณ  5๋ฒˆ์€ 1๋ฒˆ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ 2๋ฒˆ์˜ ์—ฐ๊ฒฐ๋กœ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

 

 ๋”ฐ๋ผ์„œ ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ 1๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ 2, 3๋ฒˆ ๋…ธ๋“œ๋ฅผ queue์— ๋„ฃ์€ ํ›„ 2๋ฒˆ๊ณผ 3๋ฒˆ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์„ queue์— ๋ชจ๋‘ ๋„ฃ๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ํ•˜๋ฉด ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค 1๋ฒˆ ๋…ธ๋“œ์™€ ๋ช‡ ๋ฒˆ์˜ ์—ฐ๊ฒฐ๋กœ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋“ค์ธ์ง€๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

[๋น„ํŠธ๋งˆ์Šคํฌ] : https://hini7.tistory.com/101

 

์ฑ„์  ๊ฒฐ๊ณผ

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

 ์ธ์ ‘ ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œํ˜„ํ•˜๋˜ queue๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ๊ทธ๋ž˜๋„ ์‚ฌ์šฉํ•œ ํ’€์ด๊ฐ€ ๊ฝค ๋งŽ์•˜๋‹ค. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์€ STL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋” importํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๋ฐฉ๋ฒ•๋„ ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค. (๊ณต๊ฐ„๋ณต์žก๋„๋Š” ์ฆ๊ฐ€ํ•˜๊ฒ ์ง€๋งŒ)

๋ฐ˜์‘ํ˜•