• toc {:toc}

๋ฌธ์ œ

์‚ฌ์•…ํ•œ ์•”ํ‘์˜ ๊ตฐ์ฃผ ์ด๋ฏผํ˜์€ ๋“œ๋””์–ด ๋งˆ๋ฒ• ๊ตฌ์Šฌ์„ ์†์— ๋„ฃ์—ˆ๊ณ , ๊ทธ ๋Šฅ๋ ฅ์„ ์‹คํ—˜ํ•ด๋ณด๊ธฐ ์œ„ํ•ด ๊ทผ์ฒ˜์˜ ํ‹ฐ๋–ฑ์ˆฒ์— ํ™์ˆ˜๋ฅผ ์ผ์œผํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์ด ์ˆฒ์—๋Š” ๊ณ ์Šด๋„์น˜๊ฐ€ ํ•œ ๋งˆ๋ฆฌ ์‚ด๊ณ  ์žˆ๋‹ค. ๊ณ ์Šด๋„์น˜๋Š” ์ œ์ผ ์นœํ•œ ์นœ๊ตฌ์ธ ๋น„๋ฒ„์˜ ๊ตด๋กœ ๊ฐ€๋Šฅํ•œ ๋นจ๋ฆฌ ๋„๋ง๊ฐ€ ํ™์ˆ˜๋ฅผ ํ”ผํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

ํ‹ฐ๋–ฑ์ˆฒ์˜ ์ง€๋„๋Š” Rํ–‰ C์—ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋น„์–ด์žˆ๋Š” ๊ณณ์€ โ€™.โ€™๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๊ณ , ๋ฌผ์ด ์ฐจ์žˆ๋Š” ์ง€์—ญ์€ โ€™*โ€™, ๋Œ์€ โ€˜Xโ€™๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค. ๋น„๋ฒ„์˜ ๊ตด์€ โ€˜Dโ€™๋กœ, ๊ณ ์Šด๋„์น˜์˜ ์œ„์น˜๋Š” โ€˜Sโ€™๋กœ ๋‚˜ํƒ€๋‚ด์–ด์ ธ ์žˆ๋‹ค.

๋งค ๋ถ„๋งˆ๋‹ค ๊ณ ์Šด๋„์น˜๋Š” ํ˜„์žฌ ์žˆ๋Š” ์นธ๊ณผ ์ธ์ ‘ํ•œ ๋„ค ์นธ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. (์œ„, ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ, ์™ผ์ชฝ) ๋ฌผ๋„ ๋งค ๋ถ„๋งˆ๋‹ค ๋น„์–ด์žˆ๋Š” ์นธ์œผ๋กœ ํ™•์žฅํ•œ๋‹ค. ๋ฌผ์ด ์žˆ๋Š” ์นธ๊ณผ ์ธ์ ‘ํ•ด์žˆ๋Š” ๋น„์–ด์žˆ๋Š” ์นธ(์ ์–ด๋„ ํ•œ ๋ณ€์„ ๊ณต์œ )์€ ๋ฌผ์ด ์ฐจ๊ฒŒ ๋œ๋‹ค. ๋ฌผ๊ณผ ๊ณ ์Šด๋„์น˜๋Š” ๋Œ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์—†๋‹ค. ๋˜, ๊ณ ์Šด๋„์น˜๋Š” ๋ฌผ๋กœ ์ฐจ์žˆ๋Š” ๊ตฌ์—ญ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๊ณ , ๋ฌผ๋„ ๋น„๋ฒ„์˜ ์†Œ๊ตด๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.

ํ‹ฐ๋–ฑ์ˆฒ์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ณ ์Šด๋„์น˜๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ๋น„๋ฒ„์˜ ๊ตด๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๊ณ ์Šด๋„์น˜๋Š” ๋ฌผ์ด ์ฐฐ ์˜ˆ์ •์ธ ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ๋‹ค์Œ ์‹œ๊ฐ„์— ๋ฌผ์ด ์ฐฐ ์˜ˆ์ •์ธ ์นธ์œผ๋กœ ๊ณ ์Šด๋„์น˜๋Š” ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๊ณ ์Šด๋„์น˜๊ฐ€ ๋ฌผ์— ๋น ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.ย 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜ R๊ณผ C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๋‹ค์Œ R๊ฐœ ์ค„์—๋Š” ํ‹ฐ๋–ฑ์ˆฒ์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๋ฌธ์ œ์—์„œ ์„ค๋ช…ํ•œ ๋ฌธ์ž๋งŒ ์ฃผ์–ด์ง„๋‹ค. โ€˜Dโ€™์™€ โ€˜Sโ€™๋Š” ํ•˜๋‚˜์”ฉ๋งŒ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๊ณ ์Šด๋„์น˜๊ฐ€ ๋น„๋ฒ„์˜ ๊ตด๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ, ์•ˆ์ „ํ•˜๊ฒŒ ๋น„๋ฒ„์˜ ๊ตด๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, โ€œKAKTUSโ€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด

๊ฐ€๋Šฅํ•œ ๊ฑฐ๋ฆฌ ์ค‘ โ€˜์ตœ๋‹จ ๊ฑฐ๋ฆฌโ€™๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋จผ์ € BFS(Breadth-First Search)๋ฅผ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ BFS์—์„œ ๋‹ค๋ฅธ ์ ์€ ๋ฌผ์˜ ์ด๋™์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์ง€๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” board์™€ ์ด๋™ ๊ฑฐ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” dist ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด์„ ์„ค์ •ํ–ˆ๋‹ค. ๋ฌผ์˜ ์ด๋™์˜ ๊ฒฝ์šฐ S์˜ ์ด๋™ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ™์€ ์ขŒํ‘œ๊ฐ€ ํ์— ๋“ค์–ด๊ฐ”์„ ๊ฒฝ์šฐ๋„ ๊ณ ๋ คํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— check ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ด๋™๊ฑฐ๋ฆฌ๊ฐ€ 1๊ณผ ๊ฐ™์ด ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” water() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , check 0, dist 1 ๊ณผ ๊ฐ™์ด ์ด๋™ ๊ฑฐ๋ฆฌ์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ํ„ด์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ์—๋งŒ water() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด ์ด๋™ ํ„ด์— ๋งž๊ฒŒ ๋ฌผ์ด ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
 
char board[50][50];
int dist[50][50];
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
queue<pair<int, int>> q;
queue<pair<int, int>> w;
int R, C;
 
void water(){
    int num = w.size();
    while(num--){
        pair<int, int> cur = w.front(); 
        w.pop();
        for(int dir=0; dir<4; dir++){
            int nx = cur.X + dx[dir];
            int ny = cur.Y + dy[dir];
            if ((nx < 0)||(nx >= R)||(ny < 0)||(ny >= C)) continue;
            if (board[nx][ny] != '.') continue;
            board[nx][ny] = '*';
            w.push({nx, ny});
        }
    }
}
 
int escape(){
    int check = -1;
    while(!q.empty()){
        pair<int, int> cur = q.front();
        q.pop();
        if (check != dist[cur.X][cur.Y]){
            water();
            check = dist[cur.X][cur.Y];
        }
        for (int dir=0; dir<4; dir++) {
            int nx = cur.X + dx[dir];
            int ny = cur.Y + dy[dir];
            if ((nx < 0)||(nx >= R)||(ny < 0)||(ny >= C)) continue;
            if (board[nx][ny] == '*' || board[nx][ny] == 'X' || dist[nx][ny] != -1) continue;
            dist[nx][ny] = dist[cur.X][cur.Y] + 1;
            if (board[nx][ny] == 'D') return dist[nx][ny];
            q.push({nx, ny});
        }
    }
    return -1;
};
 
int main(){
    ios::sync_with_stdio(true);
    cin.tie(), cout.tie();
 
    cin >> R >> C;
    for(int row=0; row<R; row++){
        for(int col=0; col<C; col++){
            cin >> board[row][col];
            dist[row][col] = -1;
            if (board[row][col] == 'S'){
                q.push({row, col});
                dist[row][col] = 0;
            }
            else if (board[row][col] == '*'){
                w.push({row, col});
            }
 
        }
    }
 
    int dest_dist = escape();
 
    if (dest_dist == -1){
        cout << "KAKTUS" << endl;
    }
    else{
        cout << dest_dist << endl;
    }
 
    return 0;
}

์ฐธ๊ณ ๋ฌธํ—Œ

BOJ 3055: ํƒˆ์ถœ

์—ฐ๊ฒฐ๋ฌธ์„œ