๐Ÿ’  BOJ/Class 3

[BOJ][C++] ๋ฐฑ์ค€ 21736๋ฒˆ: ํ—Œ๋‚ด๊ธฐ๋Š” ์นœ๊ตฌ๊ฐ€ ํ•„์š”ํ•ด (Silver II)

์„ ๋‹ฌ 2024. 11. 12. 05:47
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

2020๋…„์— ์ž…ํ•™ํ•œ ํ—Œ๋‚ด๊ธฐ ๋„์—ฐ์ด๊ฐ€ ์žˆ๋‹ค. ๋„์—ฐ์ด๋Š” ๋น„๋Œ€๋ฉด ์ˆ˜์—… ๋•Œ๋ฌธ์— ํ•™๊ต์— ๊ฐ€์ง€ ๋ชปํ•ด ํ•™๊ต์— ์•„๋Š” ์นœ๊ตฌ๊ฐ€ ์—†์—ˆ๋‹ค. ๋“œ๋””์–ด ๋Œ€๋ฉด ์ˆ˜์—…์„ ํ•˜๊ฒŒ ๋œ ๋„์—ฐ์ด๋Š” ์–ด์„œ ์บ ํผ์Šค ๋‚ด์˜ ์‚ฌ๋žŒ๋“ค๊ณผ ์นœํ•ด์ง€๊ณ  ์‹ถ๋‹ค.
๋„์—ฐ์ด๊ฐ€ ๋‹ค๋‹ˆ๋Š” ๋Œ€ํ•™์˜ ์บ ํผ์Šค๋Š” $N \times M$ ํฌ๊ธฐ์ด๋ฉฐ ์บ ํผ์Šค์—์„œ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฒฝ์ด ์•„๋‹Œ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„์—ฐ์ด๊ฐ€ ($x$, $y$)์— ์žˆ๋‹ค๋ฉด ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ ($x+1$, $y$), ($x$, $y+1$), ($x-1$, $y$), ($x$, $y-1$)์ด๋‹ค. ๋‹จ, ์บ ํผ์Šค์˜ ๋ฐ–์œผ๋กœ ์ด๋™ํ•  ์ˆ˜๋Š” ์—†๋‹ค.
๋ถˆ์Œํ•œ ๋„์—ฐ์ด๋ฅผ ์œ„ํ•˜์—ฌ ์บ ํผ์Šค์—์„œ ๋„์—ฐ์ด๊ฐ€ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์ž.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ์บ ํผ์Šค์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ $N$ ($ 1 \leq N \leq 600$), $M$ ($ 1 \leq M \leq 600$)์ด ์ฃผ์–ด์ง„๋‹ค.
๋‘˜์งธ ์ค„๋ถ€ํ„ฐ $N$๊ฐœ์˜ ์ค„์—๋Š” ์บ ํผ์Šค์˜ ์ •๋ณด๋“ค์ด ์ฃผ์–ด์ง„๋‹ค.O๋Š” ๋นˆ ๊ณต๊ฐ„,X๋Š” ๋ฒฝ,I๋Š” ๋„์—ฐ์ด,P๋Š” ์‚ฌ๋žŒ์ด๋‹ค.I๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์ฃผ์–ด์ง์ด ๋ณด์žฅ๋œ๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋„์—ฐ์ด๊ฐ€ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋‹จ, ์•„๋ฌด๋„ ๋งŒ๋‚˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐTT๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

๋‹จ์ˆœ BFS ๋ฌธ์ œ

๊ทผ๋ฐ ๋ฌธ์ œ ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ์•„ํ”„๋‹ค

// ํ’€์ด : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

typedef pair<int,int> ci;

int dx[] = {0,0,-1,1};
int dy[] = {1,-1,0,0};

int main() {
    int n, m;
    cin >> n >> m;

    vector<vector<char>>board(n, vector<char>(m));
    queue<ci> q;
    
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
            cin >> board[i][j];
            if(board[i][j] == 'I') {
                q.push({i,j});
            }
        }
    }
    
    int ans = 0;
    while(!q.empty()) {
        ci cur = q.front();
        q.pop();
        
        for(int dir=0; dir<4; dir++) {
            int x = cur.first + dx[dir];
            int y = cur.second + dy[dir];
            
            if(x<0 || x>=n || y<0 || y>=m) {
                continue;
            }
            
            if(board[x][y] == 'X' || board[x][y] == 'I') {
                continue;
            }
            
            if(board[x][y] == 'P') {
                ans++;
            }
            board[x][y] = 'I';
            q.push({x,y});
        }
    }
    
    if(ans==0) {
        cout << "TT";
    } else {
        cout << ans;
    }

    return 0;
}
๋ฐ˜์‘ํ˜•