ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

...XXXXXX..XX.XXX ....XXXX.......XX .....XX.......... 
....XXXXXXXXX.XXX .....XXXX..X..... ......X.......... 
...XXXXXXXXXXXX.. ....XXX..XXXX.... .....X.....X..... 
..XXXXX..XXXXXX.. ...XXX....XXXX... ....X......XX.... 
.XXXXXX..XXXXXX.. ..XXXX....XXXX... ...XX......XX.... 
XXXXXXX...XXXX... ..XXXX.....XX.... ....X............ 
..XXXXX...XXX.... ....XX.....X..... ................. 
....XXXXX.XXX.... .....XX....X..... ................. 
      ์ฒ˜์Œ               ์ฒซ์งธ ๋‚              ๋‘˜์งธ ๋‚ 

์ด๊ฑด BFS ๋ฌธ์ œ์ด๋‹ค

BFS (Breath-First search)

- L๊ณผ L ์‚ฌ์ด์— ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํŒ๋ณ„ํ•˜๊ณ , ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค๋ฉด ํ•˜๋ฃจ๊ฐ€ ์ง€๋‚˜ ์–ผ์Œ์ด ๋…น์€ ์ƒํƒœ์—์„œ ๋‹ค์‹œ ํƒ์ƒ‰

- ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๊ธธ์„ ์ฐพ์„๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ

 

BFS๋Š”?

1. L(์‹œ์ž‘๋…ธ๋“œ) ๋ฐฉ๋ฌธ

- ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ ํ์— ์‚ฝ์ž…

2. ํ์—์„œ ๊บผ๋‚ธ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ์ฐจ๋ก€๋กœ ๋ฐฉ๋ฌธ

- ํ์—์„œ ๊บผ๋‚ธ ๋…ธ๋“œ ๋ฐฉ๋ฌธ(์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ํ์˜ front์—์„œ ๋…ธ๋“œ ๊บผ๋ƒ„)

- ํ์— ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ ์‚ฝ์ž…

3. ํ๊ฐ€ ์†Œ์ง„๋  ๋•Œ๊นŒ์ง€ ๊ณ„์†

 

์ด๊ฑธ ์ด ๋ฌธ์ œ์— ์ ์šฉํ•œ๋‹ค๋ฉด

1. ๋จผ์ € ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ L ์ฃผ๋ณ€์— ์žˆ๋Š” ๋ฌผ์„ BFS๋กœ ํƒ์ƒ‰

2. ๋‹ค๋ฅธ L์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๋‹ค๋ฉด ๋ฌผ ์˜†์˜ ์–ผ์Œ์„ nextQ์— ์‚ฝ์ž…

3. ์–ผ์Œ์„ ๋…น์ž„(ํ•˜๋ฃจ ์ง€๋‚จ)

4. ๊ทธ๋ ‡๋‹ค๋ฉด nextQ์—๋Š” L์ด ๋‘˜๋Ÿฌ๋ณผ ๋ฌผ์ด ๋‚จ์Œ(์ด์ „์— ํƒ์ƒ‰ํ•œ ๋ฌผ์„ ์žฌํƒ์ƒ‰ํ•  ํ•„์š” X)

- waterQ๋ฅผ ์ƒ์„ฑํ•ด ๋ฌผ์„ ์ €์žฅํ•ด๋†“๊ณ , ์–ผ์Œ์„ ๋…น์ด๋Š” ๋ฐฉ์‹๋„ ์žˆ์Œ

 

[์ฝ”๋“œ]

// BOJ 3197๋ฒˆ : ๋ฐฑ์กฐ์˜ ํ˜ธ์ˆ˜
#include <iostream>
#include <queue>
using namespace std;

struct Queue{ // ์ขŒํ‘œ 2๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„ ํ
    int x;
    int y;
};

char lake[1501][1501]; // ํ˜ธ์ˆ˜
char visit[1501][1501]; // ๋ฐฉ๋ฌธ ํ‘œ์‹œ ๋ฐฐ์—ด
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

int main() {
    int r, c; // ํ˜ธ์ˆ˜์˜ ํ–‰, ์—ด
    int lr, lc; // L์˜ ์œ„์น˜
    string s; // ํ˜ธ์ˆ˜ ๋ฐ›๊ธฐ
    int day = 0; // ๊ฑธ๋ฆฌ๋Š” ๋‚ 

    queue<Queue> waterQ; // ๋ฌผ์ธ ๊ณณ์„ ๋„ฃ๋Š” ํ
    cin >> r >> c; // ๋จผ์ € ํ–‰๊ณผ ์—ด์„ ์ž…๋ ฅ๋ฐ›์Œ

    for(int i = 0; i < r; i++){
        cin >> s; // ๋ฌธ์ž์—ด ์ž…๋ ฅ๋ฐ›์Œ(์ค„ ๋‹จ์œ„)
        for(int j = 0; j < c; j++){
            lake[i][j] = s[j]; // ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž๋ฅผ ํ˜ธ์ˆ˜ ๋ฐฐ์—ด์— ๋Œ€์ž…
            if(lake[i][j] == 'L'){ // ๋งŒ์•ฝ L์ด๋ผ๋ฉด
                lr = i; // L์˜ ์œ„์น˜๋ฅผ ์ €์žฅ
                lc = j;
            }
            if(lake[i][j] == '.' || lake[i][j] == 'L'){
                waterQ.push({i, j}); // ๋ฌผ์ด๋ผ๋ฉด waterQ์— push
            }
        }
    }

    queue<Queue> Q;
    Q.push({lr, lc}); // L์˜ ์œ„์น˜๋ฅผ push
    visit[lr][lc] = true; // L์˜ ์œ„์น˜ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ์ฒดํฌ

    while(1){
        queue<Queue> nextQ;
        bool success = false;
        while(!Q.empty() && !success){ // ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๊ณ , ์„ฑ๊ณตํ•˜์ง€ ์•Š์„๊ฒฝ์šฐ ๋ฐ˜๋ณต
            auto temp = Q.front();
            Q.pop();

            for(int i = 0; i < 4; i++){ // ํ˜„์žฌ ์œ„์น˜์—์„œ ์ฃผ์œ„ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ(์ƒํ•˜์ขŒ์šฐ)
                int nx = temp.x + dx[i]; // ๋‹ค์Œ ํƒ์ƒ‰ํ•  x
                int ny = temp.y + dy[i]; // ๋‹ค์Œ ํƒ์ƒ‰ํ•  y

                if(nx < 0 || nx > r - 1 || ny < 0 || ny > c - 1) // ๋ฒ”์œ„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ
                    continue;
                if(lake[nx][ny] == 'L' && visit[nx][ny] == false){ // L์ธ๋ฐ ๋ฐฉ๋ฌธ X
                    success = true; // ํƒ์ƒ‰ ์„ฑ๊ณต
                    break; // ๋ฐ˜๋ณต๋ฌธ ์ข…๋ฃŒ
                }
                if(lake[nx][ny] == '.' && visit[nx][ny] == false){ // ๋ฌผ์ธ๋ฐ ๋ฐฉ๋ฌธ X
                    Q.push({nx, ny}); // ํ์— ์œ„์น˜ ๋„ฃ์Œ
                    visit[nx][ny] = true; // ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œ
                }
                if(lake[nx][ny] == 'X' && visit[nx][ny] == false){ // ์–ผ์Œ์ธ๋ฐ ๋ฐฉ๋ฌธ X
                    nextQ.push({nx, ny}); // ๋‹ค์Œ์— ๋ฐฉ๋ฌธํ•˜๊ธฐ ์œ„ํ•ด nextQ์— push
                    visit[nx][ny] = true; // ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œ
                }
            }
        }
        if(success){ // ํƒ์ƒ‰ ์„ฑ๊ณต์‹œ
            cout << day << "\n"; // ๊ฑธ๋ฆฐ ๋‚ ์งœ ์ถœ๋ ฅ
            break; // while๋ฌธ ์ข…๋ฃŒ
        }

        Q = nextQ; // ํ์— ๋ฐฉ๋ฌธํ•ด์•ผ ํ•  nextQ๋ฅผ ๋„ฃ์Œ
        int watersize = waterQ.size(); // waterQ์˜ ์›์†Œ ๊ฐœ์ˆ˜

        while(watersize){ // ํ•˜๋ฃจ๊ฐ€ ์ง€๋‚˜ ์–ผ์Œ์ด ๋…น์€ ์ƒํ™ฉ์œผ๋กœ ๋ฐ”๊ฟ”์คŒ
            auto temp = waterQ.front(); // waterQ์˜ ๋งจ ์•ž ์›์†Œ ๋‹ด์Œ
            waterQ.pop(); // ๋‹ด์€ ์›์†Œ ์ œ๊ฑฐ

            for(int i = 0; i < 4; i++){ // ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰ ์‹œ์ž‘
                int nx = temp.x + dx[i];
                int ny = temp.y + dy[i];
                if(nx < 0 || nx > r - 1 || ny < 0 || ny > c - 1) // ๋ฒ”์œ„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ
                    continue;
                if(lake[nx][ny] == 'X'){ // ์–ผ์–ด์žˆ๋Š” ๊ฒฝ์šฐ
                    waterQ.push({nx, ny}); // ์œ„์น˜ ์ €์žฅํ•˜๊ณ (push)
                    lake[nx][ny] = '.'; // ๋ฌผ๋กœ ๋ฐ”๊ฟˆ
                }
            }
            watersize--;
        }
        day++; // ํ•˜๋ฃจ ์ฆ๊ฐ€
    }
}

์—ฌ๊ธฐ์„œ auto๋ž€? → ํƒ€์ž… ์ถ”๋ก 

- auto ํ‚ค์›Œ๋“œ๋Š” ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™” ์‹์„ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ํ˜•์‹์„ ์ถ”๋ก ํ•˜๋„๋ก ์ปดํŒŒ์ผ๋Ÿฌ์— ์ง€์‹œ

- ์ฆ‰ ์ดˆ๊นƒ๊ฐ’์˜ ํ˜•์‹์— ๋งž์ถฐ ์„ ์–ธํ•˜๋Š” ์ธ์Šคํ„ด์Šค(๋ณ€์ˆ˜)์˜ ํ˜•์‹์ด '์ž๋™'์œผ๋กœ ๊ฒฐ์ • → ํƒ€์ž… ์ถ”๋ก (type inference)

์‹คํ–‰๊ฒฐ๊ณผ

 

Comments