ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] DFS(Depth First Search) ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    Algorithm & Data Structure 2022. 1. 30. 15:19
    ๋ฐ˜์‘ํ˜•

    ๋“ค์–ด๊ฐ€๋ฉฐ

     DFS๋Š” ์•ž์—์„œ ๋ฐฐ์šด BFS์ฒ˜๋Ÿผ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. BFS์™€ ๊ตฌํ˜„์˜ ์ฐจ์ด์ ์ด ์žˆ๋‹ค๋ฉด BFS์—์„œ๋Š” Queue(ํ)๋ฅผ ์‚ฌ์šฉ ํ–ˆ์ง€๋งŒ, DFS์—์„œ๋Š” Stack(์Šคํƒ)์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•œ๋‹ค.

     

    DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰) ์ด๋ž€?

    ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰( - ๅ„ชๅ…ˆๆŽข็ดข, ์˜์–ด: depth-first search, DFS)์€ ๋งน๋ชฉ์  ํƒ์ƒ‰๋ฐฉ๋ฒ•์˜ ํ•˜๋‚˜๋กœ ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ์ตœ๊ทผ์— ์ฒจ๊ฐ€๋œ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ , ์ด ๋…ธ๋“œ์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋™์ž‘์ž ์ค‘ ํ•˜๋‚˜๋ฅผ ์ ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ์— ๋‹ค์Œ ์ˆ˜์ค€(level)์˜ ํ•œ ๊ฐœ์˜ ์ž์‹๋…ธ๋“œ๋ฅผ ์ฒจ๊ฐ€ํ•˜๋ฉฐ, ์ฒจ๊ฐ€๋œ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋ชฉํ‘œ๋…ธ๋“œ์ผ ๋•Œ๊นŒ์ง€ ์•ž์˜ ์ž์‹ ๋…ธ๋“œ์˜ ์ฒจ๊ฐ€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด ๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.

    - ์œ„ํ‚ค๋ฐฑ๊ณผ

     

    DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜

     ์•„๋ž˜์˜ ์‚ฌ์ง„๋“ค์„ ๋ณด๊ณ  DFS๋ฅผ ์ดํ•ดํ•ด๋ณด์ž.

     ์‹œ์ž‘ ์ง€์ ์„ 1์ด๋ผ๊ณ  ํ•˜์ž. 1์„ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ•ด๋‹น ์นธ์„ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์Šคํƒ์˜ top์„ popํ•˜๊ณ  popํ•œ ์นธ์˜ ์ฃผ๋ณ€(์ƒํ•˜์ขŒ์šฐ)์„ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.

     ์Šคํƒ์˜ top์ธ 1์„ pop ํ–ˆ์œผ๋ฏ€๋กœ 1์˜ ์ฃผ๋ณ€์ธ 2์™€ 3์„ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.

     ์Šคํƒ์˜ top์ธ 3์„ pop ํ–ˆ์œผ๋ฏ€๋กœ 3์˜ ์ฃผ๋ณ€์ธ 6๊ณผ 7์„ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.

    ์Šคํƒ์˜ top์ธ 7์„ pop ํ–ˆ์ง€๋งŒ ์ฃผ๋ณ€์— ํƒ์ƒ‰ํ•  ๊ฒƒ์ด ์—†์–ด์„œ ๋„˜๊ธด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์Šคํƒ์˜ top์ธ 6 ๋˜ํ•œ ํƒ์ƒ‰ํ•  ๊ฒƒ์ด ์—†์œผ๋ฏ€๋กœ ๋„˜๊ธด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์Šคํƒ์˜ top์ธ 2๋ฅผ pop ํ–ˆ์œผ๋ฏ€๋กœ 2์˜ ์ฃผ๋ณ€์ธ 4์™€ 5๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.

     ์Šคํƒ์˜ top์ธ 5๋ฅผ pop ํ–ˆ์œผ๋ฏ€๋กœ 5์˜ ์ฃผ๋ณ€์ธ 9๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.

     ์Šคํƒ์˜ top์ธ 9๋ฅผ pop ํ–ˆ์ง€๋งŒ ์ฃผ๋ณ€์— ํƒ์ƒ‰ํ•  ๊ฒƒ์ด ์—†์–ด์„œ ๋„˜๊ธด๋‹ค. ๋‹ค์Œ ์Šคํƒ์˜ top์ธ 4๋ฅผ pop ํ–ˆ์œผ๋ฏ€๋กœ 4์˜ ์ฃผ๋ณ€์ธ 8์„ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.

     ์Šคํƒ์˜ top์ธ 8์„ pop ํ–ˆ์ง€๋งŒ ์ฃผ๋ณ€์— ํƒ์ƒ‰ํ•  ๊ฒƒ์ด ์—†์–ด์„œ ๋„˜๊ธด๋‹ค. ์Šคํƒ์ด ๋น„์—ˆ์œผ๋ฏ€๋กœ DFS๊ฐ€ ๋๋‚ฌ๋‹ค.

     

    DFS ๋ฌธ์ œ ํ•ด๊ฒฐ

    1.  ์‹œ์ž‘ํ•˜๋Š” ์นธ์„ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ํ•˜๊ณ  ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.
    2.  ์Šคํƒ์˜ top์— ์žˆ๋Š” ์›์†Œ๋ฅผ ๊บผ๋‚ด์–ด(pop) ๊ทธ ์›์†Œ์˜ ์ฃผ๋ณ€(์ƒํ•˜์ขŒ์šฐ)์„ ํƒ์ƒ‰ํ•œ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ์นธ์„ ์ด์ „์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ๋„˜์–ด๊ฐ€๊ณ , ์ฒ˜์Œ์œผ๋กœ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ•ด๋‹น ์นธ์„ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.
    3.  ์Šคํƒ์ด ๋นŒ ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ 2๋ฒˆ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

     

    * ๋ชจ๋“  ์นธ์€ ์Šคํƒ์— 1๋ฒˆ์”ฉ ๋“ค์–ด๊ฐ€๋‹ˆ๊นŒ DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์นธ์ด n๊ฐœ๋ผ๋ฉด O(n)์ด๋‹ค.

     

    ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” DFS๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์ด๋‹ค.

    #include <bits/stdc++.h>
    using namespace std;
    
    #define X first // pair์—์„œ first ๋ฅผ ์ค„์—ฌ ์“ฐ๊ธฐ ์œ„ํ•ด
    #define Y second // pair์—์„œ second๋ฅผ ์ค„์—ฌ ์“ฐ๊ธฐ ์œ„ํ•ด
    
    int board[502][502] =
    {{1,1,1,0,1,0,0,0,0,0},
     {1,0,0,0,1,0,0,0,0,0},
     {1,1,1,0,1,0,0,0,0,0},
     {1,1,0,0,1,0,0,0,0,0},
     {0,1,0,0,0,0,0,0,0,0},
     {0,0,0,0,0,0,0,0,0,0},
     {0,0,0,0,0,0,0,0,0,0} }; // 1์ด ํŒŒ๋ž€ ์นธ, 0์ด ๋นจ๊ฐ„ ์นธ์— ๋Œ€์‘
    
    bool vis[502][502]; // ํ•ด๋‹น ์นธ์„ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ์ €์žฅ
    int n = 7, m = 10; // n = ํ–‰์˜ ์ˆ˜, m = ์—ด์˜ ์ˆ˜
    int dx[4] = { 1, 0, -1, 0 }; // ์ƒํ•˜์ขŒ์šฐ 4๊ฐœ์˜ ๋ฐฉํ–ฅ์„ ์˜๋ฏธ
    int dy[4] = { 0, 1, 0, -1 }; // ์ƒํ•˜์ขŒ์šฐ 4๊ฐœ์˜ ๋ฐฉํ–ฅ์„ ์˜๋ฏธ
    
    int main(void) {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	
    	stack<pair<int, int>> S;
    	vis[0][0] = 1; // (0, 0) ์ขŒํ‘œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œ
    	S.push({0, 0});
    	
    	while (!S.empty()) {
    		pair<int, int> cur = S.top(); // ์›์†Œ์˜ ์ฃผ๋ณ€์„ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด cur๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    		S.pop(); // ์Šคํƒ์˜ top์— ์žˆ๋Š” ์›์†Œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
    		
    		cout << '(' << cur.X << ", " << cur.Y << ") -> ";
    		
    	for (int dir = 0; dir < 4; dir++) { // ์ƒํ•˜์ขŒ์šฐ ์นธ์„ ํƒ์ƒ‰ํ•œ๋‹ค.
    			int nx = cur.X + dx[dir]; // nx์— dir์—์„œ ์ •ํ•œ ๋ฐฉํ–ฅ(์ƒํ•˜์ขŒ์šฐ)์˜ ์ธ์ ‘ํ•œ ์นธ์˜ ์ขŒํ‘œ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.
    			int ny = cur.Y + dy[dir]; // ny์— dir์—์„œ ์ •ํ•œ ๋ฐฉํ–ฅ(์ƒํ•˜์ขŒ์šฐ)์˜ ์ธ์ ‘ํ•œ ์นธ์˜ ์ขŒํ‘œ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.
    			
    			if (nx < 0 || nx >= n || ny < 0 || ny >= m) { 
    				continue; // ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ์—๋Š” ๋„˜์–ด๊ฐ„๋‹ค.
    			}
    			if (vis[nx][ny] || board[nx][ny] != 1) {
    				continue; // ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์นธ์ด๊ฑฐ๋‚˜ ๋ฐฉ๋ฌธํ•  ํ•„์š”๊ฐ€ ์—†๋Š”(๋นจ๊ฐ„ ์นธ)์ผ ๊ฒฝ์šฐ ๋„˜์–ด๊ฐ„๋‹ค.
    			}
    			
    			vis[nx][ny] = 1; // (nx, ny) ์ขŒํ‘œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•œ๋‹ค.
    			S.push({nx, ny}); // ํ•ด๋‹น ์นธ์„ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.
    		}
    	}
    	
    	return 0;
    }
    ๋ฐ˜์‘ํ˜•
Designed by Tistory.