์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[๋ฐฑ์ค€(BOJ)] 2606๋ฒˆ: ๋ฐ”์ด๋Ÿฌ์Šค (DFS/BFS, C++)

PROGRAMMING/Algorithm

by koharin 2021. 1. 21. 23:42

๋ณธ๋ฌธ

728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ป C++ ์ฝ”๋“œ (์ œ์ถœ ์ฝ”๋“œ)


#include <stdio.h>
#include <vector>

using namespace std;

void dfs(int computer, vector<int> *graph, bool *check, vector<int> *worm){

    check[computer]=true; //๋ฐฉ๋ฌธ ์ฒดํฌ
    
    for(int i = 0; i < graph[computer].size(); i++){ //๊ฐ์—ผ๋œ ์ปดํ“จํ„ฐ์™€ ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ๋„ ๊ฐ์—ผ์ด๋ฏ€๋กœ 
        int next = graph[computer][i];
        if(check[next] == false){
            (*worm).push_back(next); //0ํฌํ•จ ์•ˆ๋˜๋„๋ก..
            dfs(next, graph, check, worm);
            
        }
    }
}

int main()
{
    int n,m; //n: ์ •์ ์˜ ์ˆ˜, m: ๊ฐ„์„ ์˜ ์ˆ˜
   
    
    scanf("%d", &n);
    scanf("%d", &m);
    
    vector<int> graph[n];
    vector<int> worm_computer;
    bool check[n];
    
    fill(check, check+n, false);

    for(int i=0; i<m; i++)
    {
        int u,v; //๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ปดํ“จํ„ฐ์˜ ๋ฒˆํ˜ธ ์Œ
        
        scanf("%d %d", &u, &v);
        //์–‘๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
        graph[u-1].push_back(v-1);
        graph[v-1].push_back(u-1);
    }
    
    dfs(0, graph, check, &worm_computer);

    printf("%d", worm_computer.size());

}

 

 

๐Ÿ“ ๋ฌธ์ œํ’€์ด ๊ณผ์ •


1. ๊ทธ๋ž˜ํ”„ ๋งŒ๋“ค๊ธฐ

  • ์ •์ ์˜ ๊ฐœ์ˆ˜(n)๋งŒํผ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” vector ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 

    • ํ•„์ž์˜ ๊ฒฝ์šฐ, 1๋ฒˆ ์ปดํ“จํ„ฐ๊ฐ€ 0๋ฒˆ์งธ๋ถ€ํ„ฐ ๋“ค์–ด๊ฐ€๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

  • graph[i]๋Š” i๋ฒˆ์งธ ์ •์ ์— ์—ฐ๊ฒฐ๋œ ์ •์ ๋“ค์ด ๋‹ด๊ธด๋‹ค.

  • ์–‘๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ด๋ฏ€๋กœ, ๋„คํŠธ์›Œํฌ ์ƒ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ปดํ“จํ„ฐ์˜ ๋ฒˆํ˜ธ ์Œ์— ๋”ฐ๋ผ vector์— ๊ฐ’์„ ๋„ฃ์–ด์ค„ ๋•Œ (u,v) ์ •์ ์— ๋Œ€ํ•ด graph[u-1]์— ๋„ฃ์–ด์ฃผ๊ณ , graph[v-1]์—๋„ ๋„ฃ์–ด์ค€๋‹ค.

2. ์›œ ๋ฐ”์ด๋Ÿฌ์Šค ๊ฑธ๋ฆฐ ์ปดํ“จํ„ฐ ๊ตฌํ•˜๊ธฐ: DFS๋กœ ๊ตฌํ˜„

  • DFS ํƒ์ƒ‰์„ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•ด์„œ, ๊ฐ ์ปดํ“จํ„ฐ์— ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ปดํ“จํ„ฐ๊ฐ€ ๊ณ ๋ ค๋˜๋„๋ก ํ•œ๋‹ค.

  • ๋จผ์ € visited๋กœ ํƒ์ƒ‰ ์œ ๋ฌด๋ฅผ ํŒ๋‹จํ•œ๋‹ค. ์–‘๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ปดํ“จํ„ฐ๋ฅผ ๋‹ค์‹œ ํƒ์ƒ‰ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

  • ํ•จ์ˆ˜ ์ฒ˜์Œ์— visited๋ฅผ true๋กœ ํ•˜๊ณ , ํ•ด๋‹น ์ปดํ“จํ„ฐ์— ์—ฐ๊ฒฐ๋œ ์›์†Œ๋“ค์— ๋Œ€ํ•ด ๋‹ค์Œ ํƒ์ƒ‰ํ•  ์ปดํ“จํ„ฐ๋ฅผ next๋กœ ๊ฐ€์ง€๊ณ  ๋งŒ์•ฝ check[next]๊ฐ€ false์ด๋ฉด ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ปดํ“จํ„ฐ์ด๋ฏ€๋กœ ํƒ์ƒ‰ํ•œ๋‹ค. 

  • dfs ํ•จ์ˆ˜ ์ดˆ๋ฐ˜์— vector์— ๋„ฃ๋Š” ์ž‘์—…์„ ํ•˜๋ฉด ๋งจ ์ฒ˜์Œ์— ๋ฐฉ๋ฌธํ•˜๋Š” 1๋ฒˆ ์ปดํ“จํ„ฐ๊ฐ€ vector์— ํฌํ•จ๋˜๊ฒŒ ๋˜๋ฏ€๋กœ,  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ปดํ“จํ„ฐ์ธ ์กฐ๊ฑด์ผ ๋•Œ์— vector์— ๋„ฃ์–ด์ค€๋‹ค.

#include <stdio.h>
#include <vector>

using namespace std;


void dfs(int computer, vector<int> *graph, bool *check, vector<int> *worm){

    check[computer]=true; //๋ฐฉ๋ฌธ ์ฒดํฌ
    //(*worm).push_back(computer); //๊ฐ์—ผ๋œ ์ปดํ“จํ„ฐ vector์— ๋„ฃ์Œ
    printf("[+] %d INFECTED\n", computer);
    for(int i = 0; i < graph[computer].size(); i++){ //๊ฐ์—ผ๋œ ์ปดํ“จํ„ฐ์™€ ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ๋„ ๊ฐ์—ผ์ด๋ฏ€๋กœ 
        int next = graph[computer][i];
        if(check[next] == false){
            (*worm).push_back(next); //1๋ฒˆ ์ปดํ“จํ„ฐ ํฌํ•จ ์•ˆ๋˜๋„๋ก..
            dfs(next, graph, check, worm);
            
        }
    }
}

int main()
{
    int n,m; //n: ์ •์ ์˜ ์ˆ˜, m: ๊ฐ„์„ ์˜ ์ˆ˜
   
    
    scanf("%d", &n);
    scanf("%d", &m);
    
    vector<int> graph[n];
    vector<int> worm_computer;
    bool check[n];
    
    fill(check, check+n, false);

    for(int i=0; i<m; i++)
    {
        int u,v; //๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ปดํ“จํ„ฐ์˜ ๋ฒˆํ˜ธ ์Œ
        
        scanf("%d %d", &u, &v);
        //์–‘๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
        graph[u-1].push_back(v-1);
        graph[v-1].push_back(u-1);
    }
    
    dfs(0, graph, check, &worm_computer); //1๋ฒˆ ์ปดํ“จํ„ฐ๋ถ€ํ„ฐ ๋ฐฉ๋ฌธ ์‹œ์ž‘


    printf("\ninfected computers: ");
    for(int c: worm_computer) printf("%d ", c);
    printf("\n# of infected: %d", worm_computer.size());

}

 

 

 

๐Ÿ™„ ๋ฐ˜๋ก€


5 
4 
1 3 
1 4 
2 5 
3 2
  • ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ๋ฐ˜๋ก€๋Š” ์œ„์™€ ๊ฐ™๋‹ค.

 

 

 

๐Ÿ‘ ๊ฒฐ๊ณผ


 

728x90
๋ฐ˜์‘ํ˜•

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ