๐Ÿ“ Coding Test Study

[Algorithm&์ž๋ฃŒ๊ตฌ์กฐ] BFS/DFS?

ibelieveinme 2021. 4. 13. 04:22
728x90

โ˜… BFS/DFS ํƒ์ƒ‰์˜ ๋ชฉ์ 

: ์‹œ์ž‘์  X์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋ชจ๋“  ์ •์ ์„ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ.

 

1. DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰) Stack(ํ›„์ž…์„ ์ถœ) ๊ณผ ์žฌ๊ท€ํ•จ์ˆ˜ ์‚ฌ์šฉ

: ํ•œ ์‹œ์ž‘์ ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ์ง„ํ–‰. ๋” ์ด์ƒ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ ์ด์ „์œผ๋กœ ๋Œ์•„์™€์„œ ๋‹ค์‹œ ๊ฐˆ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ง„ํ–‰

: ๋ฐฉ๋ฌธํ–ˆ๋Š” ์ง€, ์•ˆํ–ˆ๋Š” ์ง€๋ฅผ ์ฒดํฌํ•  visited[] ๋ฐฐ์—ด ์‚ฌ์šฉ

i 1 2 3 4 5 6
visited[i] 0 0 0 0 0 0

1) 1 ๋ฐฉ๋ฌธ

    stack 1

    visited[1] = 1 ๋Œ€์ž…

2) 1๊ณผ ์—ฐ๊ฒฐ๋œ 2, 5 ์ค‘์— ์ž‘์€ ๊ฐ’์ธ 2 ๋ฐฉ๋ฌธ(์ •์  ๊ฐ’์ด ์ž‘์€ ๊ณณ์œผ๋กœ ์ด๋™)

    stack 1 2

    visited[2] = 1

3) 2์™€ ์—ฐ๊ฒฐ๋œ 3, 5 ์ค‘์— 3 ๋ฐฉ๋ฌธ

    stack 1 2 3

    visited[3] = 1

3) 3๊ณผ ์—ฐ๊ฒฐ๋œ 4 ๋ฐฉ๋ฌธ

    stack 1 2 3 4

    visited[4] = 1

4) 4์™€ ์—ฐ๊ฒฐ๋œ 5, 6 ์ค‘์— 5 ๋ฐฉ๋ฌธ

    stack 1 2 3 4 5

    visited[5] = 1

5) 5์—์„œ ๋”์ด์ƒ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์—†์œผ๋ฏ€๋กœ stack์˜ ๋งˆ์ง€๋ง‰(๋ฐ”๋กœ ์ „ ์ „ ์ •์ ) ๊ฐ’(4)์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ.

    stack 1 2 3 4

6) 4์—์„œ ๋‹ค์‹œ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜์—ฌ 6 ๋ฐฉ๋ฌธ

    stack 1 2 3 4 6

    visited[6] = 1

7) 2์—์„œ ๋”์ด์ƒ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ(visited[i] = 0 ์ธ ๊ณณ)์ด ์—†์œผ๋ฏ€๋กœ stack์—์„œ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ 1๋กœ ๋Œ์•„์˜ค๊ธฐ

    stack 

 

1) DFS๋ฅผ ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• -> ์‹œ๊ฐ„๋ณต์žก๋„ O(V^2)

void dfs(int x){
	visited[x] = true;
	cout << x;
	for(int i = 1; i<=n; i++){
		if(a[x][i] == 1 && visited[i] == false){
			dfs(i);
		}
	}
}

; ๋ชจ๋“ ์ •์ ์„ ํƒ์ƒ‰

 

2) DFS๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• -> ์‹œ๊ฐ„ ๋ณต์žก๋„ O(V+E)

void dfs(int x){
	visited[x] = true;
    cout << x;
    for(int i = 0; i<a[x].size(); i++){
    	int y = a[x][i];
        if(visited[y] == false){
        	dfs(y);
            }
        }
    }
}

; ์ธ์ ‘ํ–‰๋ ฌ๊ณผ ๋‹ค๋ฅธ ์ ์€ a[x]์— ์ €์žฅ๋œ ์—ฐ๊ฒฐ๋œ ๋‹ค์Œ ๊ฐ„์„ ๋งŒ์„ ์ฐพ์•„์„œ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Œ.

 

 

2. BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) queue(์„ ์ž…์„ ์ถœ) ์ด์šฉ

: ํ•œ ์‹œ์ž‘์ ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์ง„ํ–‰.

: ํ๋ฅผ ์ด์šฉํ•ด์„œ ์ง€๊ธˆ ์œ„์น˜์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ชจ๋‘ ํ์— ๋„ฃ๋Š” ๋ฐฉ์‹.

: ํ์— ๋„ฃ์„ ๋•Œ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ์ฒดํฌํ•ด์•ผ ํ•œ๋‹ค. visited[] ๋ฐฐ์—ด ์‚ฌ์šฉ

i 1 2 3 4 5 6
visited[i] 0 0 0 0 0 0

1) queue 1 ๋„ฃ๊ณ  visited ์ฒดํฌ

  visited[1] = 1

2) queue.pop() ํ•ด์„œ queue์˜ ์ฒซ๋ฒˆ์งธ ๊ฐ’์ธ 1๋ถ€ํ„ฐ ํƒ์ƒ‰ ์‹œ์ž‘

  queue 

2) 1๊ณผ ์—ฐ๊ฒฐ๋œ 2, 5 ํ์— ์ €์žฅํ•˜๊ณ  visited ์ฒดํฌ

   queue 2 5

   visited[2] = 1, visited[5] = 1

2) queue.pop() ํ•ด์„œ queue์˜ ๋งจ ์•ž ๊ฐ’์ธ 2 ๋ถ€ํ„ฐ ํƒ์ƒ‰ ์‹œ์ž‘

   queue 5

3) 2์™€ ์—ฐ๊ฒฐ๋œ 3 queue์— ์ €์žฅํ•˜๊ณ  visited ์ฒดํฌ

   queue 5 3

   visited[3] = 1

4) queue.pop()ํ•ด์„œ queue์˜ ๋งจ ์•ž ๊ฐ’์ธ 5 ๋ถ€ํ„ฐ ํƒ์ƒ‰ ์‹œ์ž‘

   queue 3

5) 5์™€ ์—ฐ๊ฒฐ๋œ 4 queue์— ์ €์žฅํ•˜๊ณ  visited ์ฒดํฌ

   queue 3 4

   visited[4] = 1

6) queue.pop()ํ•ด์„œ queue์˜ ๋งจ ์•ž ๊ฐ’์ธ 3 ๋ถ€ํ„ฐ ํƒ์ƒ‰ ์‹œ์ž‘

   queue 4

7) 3๊ณผ ์—ฐ๊ฒฐ๋œ ์ •์  ์ค‘์— ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ ์ด ์—†์œผ๋ฏ€๋กœ ๋‹ค์‹œ queue.pop() ํ•ด์„œ 4์—์„œ ํƒ์ƒ‰ ์‹œ์ž‘

   queue 

8) 4์™€ ์—ฐ๊ฒฐ๋œ 6 queue์— ์ €์žฅํ•˜๊ณ  visited ์ฒดํฌ

   queue 6

   visited[6] = 1

9) queue.pop()ํ•ด์„œ queue์˜ ๋งจ ์•ž ๊ฐ’์ธ 6 ์—์„œ ํƒ์ƒ‰ ์‹œ์ž‘

   queue

10) 6๊ณผ ์—ฐ๊ฒฐ๋œ ์ •์  ์ค‘์— ๋ฐฉ๋ฌธํ•  ์ •์ ์—†๊ณ , queue ๊ฐ€ ๋น„์—ˆ์œผ๋ฏ€๋กœ ํƒ์ƒ‰ ์ข…๋ฃŒ.

 

1) BFS๋ฅผ ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• -> ์‹œ๊ฐ„๋ณต์žก๋„ O(V^2)

queue<int> q;
visited[1] = true;
q.push(1);
while(!q.empty()){
	int x = q.front();
    q.pop();
    cout << x;
    for(int i = 1; i<=n; i=+){
    	if(a[x][i] == 1 && visited[i] == false){
        	visited[i] = true;
            q.push(i);
           }
     }
}

2) BFS๋ฅผ ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• -> ์‹œ๊ฐ„ ๋ณต์žก๋„ O(V+E)

queue<int> q;
visited[1] = true;
q.push(1);
while(!q.empty()){
	int x = q.front();
    q.pop();
    cout << x;
    for(int i = 1; i<a[x].size(); i=+){
    int y = a[x][i];
    	if(visited[y] == false){
        	visited[y] = true;
            q.push(y);
           }
     }
}

 

<์ฐธ๊ณ ๋ฌธ์ œ>

 

1260๋ฒˆ: DFS์™€ BFS

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ M(1 ≤ M ≤ 10,000), ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•  ์ •์ ์˜ ๋ฒˆํ˜ธ V๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ„์„ ์ด ์—ฐ๊ฒฐํ•˜๋Š” ๋‘ ์ •์ ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์–ด๋–ค ๋‘ ์ •์  ์‚ฌ

www.acmicpc.net

 

728x90