ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] BFS(Breadth First Search) ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    Algorithm & Data Structure 2022. 1. 21. 23:01
    ๋ฐ˜์‘ํ˜•

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

     BFS๋Š” ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. Flood Fill๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Queue(ํ)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค!

     

    BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) ์ด๋ž€?

    ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(Breadth-first search, BFS)์€ ๋งน๋ชฉ์  ํƒ์ƒ‰๋ฐฉ๋ฒ•์˜ ํ•˜๋‚˜๋กœ ์‹œ์ž‘ ์ •์ ์„ ๋ฐฉ๋ฌธํ•œ ํ›„ ์‹œ์ž‘ ์ •์ ์— ์ธ์ ‘ํ•œ ๋ชจ๋“  ์ •์ ๋“ค์„ ์šฐ์„  ๋ฐฉ๋ฌธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ์ด ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ์ •์ ๋“ค์— ๋Œ€ํ•ด์„œ๋„ ๋„ˆ๋น„ ์šฐ์„  ๊ฒ€์ƒ‰์„ ์ ์šฉํ•œ๋‹ค. OPEN List๋Š” ํ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ๋ ˆ๋ฒจ ์ˆœ์„œ๋Œ€๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

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

     

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

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

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

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

     ํ์˜ front์ธ 2๋ฅผ ์‚ญ์ œํ•˜๊ณ  2์˜ ์ฃผ๋ณ€์ธ 4์™€ 5๋ฅผ ํƒ์ƒ‰ํ–ˆ์œผ๋ฏ€๋กœ ์ด ์นธ๋“ค์„ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ์— ๋„ฃ๋Š”๋‹ค.

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

     ํ์˜ front์ธ 4๋ฅผ ์‚ญ์ œํ•˜๊ณ  4์˜ ์ฃผ๋ณ€์ธ 8์„ ํƒ์ƒ‰ํ–ˆ์œผ๋ฏ€๋กœ ์ด ์นธ์„ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ์— ๋„ฃ๋Š”๋‹ค.

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

     ๋‚˜๋จธ์ง€๋“ค๋„ ๋˜‘๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ํ์˜ front๋ฅผ ํ™•์ธํ•˜๋Š” ๋“ฑ์˜ ๊ณผ์ •์„ ํ–ˆ๋Š”๋ฐ ํ•ด๋‹น ์ฃผ๋ณ€์˜ ์ขŒํ‘œ๋“ค์„ ๋ชจ๋‘ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฏ€๋กœ ํ์—์„œ ์‚ญ์ œํ•œ๋‹ค.

     

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

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

     

    * ๋ชจ๋“  ์นธ์€ ํ์— 1๋ฒˆ์”ฉ ๋“ค์–ด๊ฐ€๋‹ˆ๊นŒ BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์นธ์ด n๊ฐœ๋ผ๋ฉด O(n)์ด๋‹ค. ๋งŒ์•ฝ์— ํ–‰์ด r๊ฐœ, ์—ด์ด c๊ฐœ๋ผ๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(rc)์ด๋‹ค.

     

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

    #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);
    	
    	queue<pair<int, int>> Q;
    	vis[0][0] = 1; // (0, 0) ์ขŒํ‘œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œ
    	Q.push({0, 0}); // ํ์— ์‹œ์ž‘ ์ขŒํ‘œ(0, 0)๋ฅผ ๋„ฃ๋Š”๋‹ค.
    	
    	while (!Q.empty()) {
    		pair<int, int> cur = Q.front(); // ์›์†Œ์˜ ์ฃผ๋ณ€์„ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด cur๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    		Q.pop(); // ํ์˜ front์— ์žˆ๋Š” ์›์†Œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
    		
    		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) ์ขŒํ‘œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•œ๋‹ค.
    			Q.push({nx, ny}); // ํ•ด๋‹น ์นธ์„ ํ์— ๋„ฃ๋Š”๋‹ค.
    		}
    	}
    	
    	return 0;
    }
    ๋ฐ˜์‘ํ˜•
Designed by Tistory.