๐Ÿ• Baaaaaarking/0x09๊ฐ• - BFS

[BOJ G4][C++] ๋ฐฑ์ค€ 2573๋ฒˆ: ๋น™์‚ฐ

์„ ๋‹ฌ 2022. 4. 15. 09:34
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/2573

 

2573๋ฒˆ: ๋น™์‚ฐ

์ฒซ ์ค„์—๋Š” ์ด์ฐจ์› ๋ฐฐ์—ด์˜ ํ–‰์˜ ๊ฐœ์ˆ˜์™€ ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ N๊ณผ M์ด ํ•œ ๊ฐœ์˜ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. N๊ณผ M์€ 3 ์ด์ƒ 300 ์ดํ•˜์ด๋‹ค. ๊ทธ ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ์ค„๋งˆ๋‹ค ๋ฐฐ์—ด์˜ ๊ฐ ํ–‰์„

www.acmicpc.net

 

๋ฌธ์ œ

์ง€๊ตฌ ์˜จ๋‚œํ™”๋กœ ์ธํ•˜์—ฌ ๋ถ๊ทน์˜ ๋น™์‚ฐ์ด ๋…น๊ณ  ์žˆ๋‹ค. ๋น™์‚ฐ์„ ๊ทธ๋ฆผ 1๊ณผ ๊ฐ™์ด 2์ฐจ์› ๋ฐฐ์—ด์— ํ‘œ์‹œํ•œ๋‹ค๊ณ  ํ•˜์ž. ๋น™์‚ฐ์˜ ๊ฐ ๋ถ€๋ถ„๋ณ„ ๋†’์ด ์ •๋ณด๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์นธ์— ์–‘์˜ ์ •์ˆ˜๋กœ ์ €์žฅ๋œ๋‹ค. ๋น™์‚ฐ ์ด์™ธ์˜ ๋ฐ”๋‹ค์— ํ•ด๋‹น๋˜๋Š” ์นธ์—๋Š” 0์ด ์ €์žฅ๋œ๋‹ค. ๊ทธ๋ฆผ 1์—์„œ ๋นˆ์นธ์€ ๋ชจ๋‘ 0์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

             
  2 4 5 3    
  3   2 5 2  
  7 6 2 4    
             

๊ทธ๋ฆผ 1. ํ–‰์˜ ๊ฐœ์ˆ˜๊ฐ€ 5์ด๊ณ  ์—ด์˜ ๊ฐœ์ˆ˜๊ฐ€ 7์ธ 2์ฐจ์› ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๋น™์‚ฐ์˜ ๋†’์ด ์ •๋ณด

๋น™์‚ฐ์˜ ๋†’์ด๋Š” ๋ฐ”๋‹ท๋ฌผ์— ๋งŽ์ด ์ ‘ํ•ด์žˆ๋Š” ๋ถ€๋ถ„์—์„œ ๋” ๋นจ๋ฆฌ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ์—ด์—์„œ ๋น™์‚ฐ์˜ ๊ฐ ๋ถ€๋ถ„์— ํ•ด๋‹น๋˜๋Š” ์นธ์— ์žˆ๋Š” ๋†’์ด๋Š” ์ผ๋…„๋งˆ๋‹ค ๊ทธ ์นธ์— ๋™์„œ๋‚จ๋ถ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ๋ถ™์–ด์žˆ๋Š” 0์ด ์ €์žฅ๋œ ์นธ์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ค„์–ด๋“ ๋‹ค. ๋‹จ, ๊ฐ ์นธ์— ์ €์žฅ๋œ ๋†’์ด๋Š” 0๋ณด๋‹ค ๋” ์ค„์–ด๋“ค์ง€ ์•Š๋Š”๋‹ค. ๋ฐ”๋‹ท๋ฌผ์€ ํ˜ธ์ˆ˜์ฒ˜๋Ÿผ ๋น™์‚ฐ์— ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋ฆผ 1์˜ ๋น™์‚ฐ์€ ์ผ๋…„ํ›„์— ๊ทธ๋ฆผ 2์™€ ๊ฐ™์ด ๋ณ€ํ˜•๋œ๋‹ค.

๊ทธ๋ฆผ 3์€ ๊ทธ๋ฆผ 1์˜ ๋น™์‚ฐ์ด 2๋…„ ํ›„์— ๋ณ€ํ•œ ๋ชจ์Šต์„ ๋ณด์—ฌ์ค€๋‹ค. 2์ฐจ์› ๋ฐฐ์—ด์—์„œ ๋™์„œ๋‚จ๋ถ ๋ฐฉํ–ฅ์œผ๋กœ ๋ถ™์–ด์žˆ๋Š” ์นธ๋“ค์€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๊ณ  ๋งํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋ฆผ 2์˜ ๋น™์‚ฐ์€ ํ•œ ๋ฉ์–ด๋ฆฌ์ด์ง€๋งŒ, ๊ทธ๋ฆผ 3์˜ ๋น™์‚ฐ์€ ์„ธ ๋ฉ์–ด๋ฆฌ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค.

             
    2 4 1    
  1   1 5    
  5 4 1 2    
             

๊ทธ๋ฆผ 2

             
      3      
        4    
  3 2        
             

๊ทธ๋ฆผ 3

ํ•œ ๋ฉ์–ด๋ฆฌ์˜ ๋น™์‚ฐ์ด ์ฃผ์–ด์งˆ ๋•Œ, ์ด ๋น™์‚ฐ์ด ๋‘ ๋ฉ์–ด๋ฆฌ ์ด์ƒ์œผ๋กœ ๋ถ„๋ฆฌ๋˜๋Š” ์ตœ์ดˆ์˜ ์‹œ๊ฐ„(๋…„)์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๊ทธ๋ฆผ 1์˜ ๋น™์‚ฐ์— ๋Œ€ํ•ด์„œ๋Š” 2๊ฐ€ ๋‹ต์ด๋‹ค. ๋งŒ์ผ ์ „๋ถ€ ๋‹ค ๋…น์„ ๋•Œ๊นŒ์ง€ ๋‘ ๋ฉ์–ด๋ฆฌ ์ด์ƒ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ ์ค„์—๋Š” ์ด์ฐจ์› ๋ฐฐ์—ด์˜ ํ–‰์˜ ๊ฐœ์ˆ˜์™€ ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ N๊ณผ M์ด ํ•œ ๊ฐœ์˜ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. N๊ณผ M์€ 3 ์ด์ƒ 300 ์ดํ•˜์ด๋‹ค. ๊ทธ ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ์ค„๋งˆ๋‹ค ๋ฐฐ์—ด์˜ ๊ฐ ํ–‰์„ ๋‚˜ํƒ€๋‚ด๋Š” M๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ํ•œ ๊ฐœ์˜ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์นธ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’์€ 0 ์ด์ƒ 10 ์ดํ•˜์ด๋‹ค. ๋ฐฐ์—ด์—์„œ ๋น™์‚ฐ์ด ์ฐจ์ง€ํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜, ์ฆ‰, 1 ์ด์ƒ์˜ ์ •์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์นธ์˜ ๊ฐœ์ˆ˜๋Š” 10,000 ๊ฐœ ์ดํ•˜์ด๋‹ค. ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ํ–‰๊ณผ ์—ด, ๋งˆ์ง€๋ง‰ ํ–‰๊ณผ ์—ด์—๋Š” ํ•ญ์ƒ 0์œผ๋กœ ์ฑ„์›Œ์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ ์ค„์— ๋น™์‚ฐ์ด ๋ถ„๋ฆฌ๋˜๋Š” ์ตœ์ดˆ์˜ ์‹œ๊ฐ„(๋…„)์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์ผ ๋น™์‚ฐ์ด ๋‹ค ๋…น์„ ๋•Œ๊นŒ์ง€ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

๋ณธ ๋ฌธ์ œ๋Š” ์•ฝ๊ฐ„ ์น˜์ฆˆ(https://www.acmicpc.net/problem/2638) ๋ฌธ์ œ์˜ ์‘์šฉ๋ฒ„์ „์ด๋ผ๋Š” ๋Š๋‚Œ์ด ๋“ค์—ˆ๋‹ค.
๊ทผ๋ฐ ์น˜์ฆˆ๋ฌธ์ œ ํ’€์ด๋ฅผ ์•ˆ์ ์—ˆ๋„ค.. ์—ํœด..

์šฐ์„  ํฐ ํ’€์ด๋Š”

1. bfs ๋ฅผ ๋Œ๋ฆฌ๋ฉฐ ๋น™ํ•˜ ๋…น์ด๊ธฐ

2. bfs ๋ฅผ ๋Œ๋ฆฌ๋ฉฐ ๋น™ํ•˜๊ฐ€ ๋‘๋ฉ์ด๋กœ ๋‚˜๋‰˜์—ˆ๋Š”์ง€ ์ฒดํฌ

์ด๋ ‡๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ์ง„ํ–‰๋˜๋Š”๋ฐ,

 

 

// (1)

1๋ฒˆ์—์„œ ๋น™ํ•˜๋ฅผ ๋…น์ผ๋•Œ

1-1. ์ด์ค‘๋ฐฐ์—ด์„ ๋Œ๋ฉฐ ๋…น์„ ๋Œ€์ƒ์ธ ์–ผ์Œ๋“ค์„ ์ฐพ๊ณ 

1-2. ์ด ์–ผ์Œ์˜ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋ณด๋ฉด์„œ ์–ผ๋งˆ๋‚˜ ๋…น์ผ์ง€ (๋ฐ”๋‹ค์™€ ์–ผ๋งˆ๋‚˜ ์ ‘ํ•ด์žˆ๋Š”์ง€)๋ฅผ ์นด์šดํŠธ

1-3. ๋ฒกํ„ฐ์— ํ•ด๋‹น ์–ผ์Œ์˜ x์ขŒํ‘œ, y์ขŒํ‘œ, ๋…น์ผ ์–‘์„ push ํ•ด๋‘ 

1-4. ์ถ”ํ›„ ํ•ด๋‹น ๋ฒกํ„ฐ๋ฅผ ๋Œ๋ฉฐ ํ•œ๋ฒˆ์— ๋…น์ด๊ธฐ

 

 

// (2)

์—ฌ๊ธฐ์„œ ํ•œ๋ฒˆ์— ๋…น์—ฌ์•ผํ•œ๋‹ค๋Š”๊ฒŒ ํฌ์ธํŠธ๋‹ค

์ˆœ์ฐจ์ ์œผ๋กœ ๋…น์—ฌ๋ฒ„๋ฆฌ๋ฉด ๊ฐ™์€ํ•ด์— ์ƒ๊ธด ๋ณ€ํ™”์— ์˜ํ–ฅ์„ ๋ฐ›์•„ ์ด์ƒํ•˜๊ฒŒ ๋…น์•„๋ฒ„๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ.

 

// (3)

๊ทธ๋ฆฌ๊ณ  ๋˜ ๋น™ํ•˜๊ฐ€ ์ „๋ถ€ ๋…น์•„๋ฒ„๋ ธ๋‹ค๋ฉด,

์ฆ‰ ๋ชจ๋“  ๋น™ํ•˜์˜ ๋†’์ด๊ฐ€ 0์ด ๋˜์—ˆ๋‹ค๋ฉด

0์„ ์ถœ๋ ฅํ•˜๊ณ  ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ด์•ผํ•œ๋‹ค.

 

// Authored by : seondal
// ํ’€์ด : https://whkakrkr.tistory.com/
// Co-authored by : -

//#include <bits/stdc++.h>
#include <iostream>
#include <queue>

using namespace std;

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

int n,m, year=0;
int board[302][302];

bool isDivided() {
    int cnt = 0;
    bool vis[302][302];
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            vis[i][j] = false;
    queue<pair<int,int>> q;
    
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if(vis[i][j] || board[i][j]==0) continue;
            cnt++;
            vis[i][j] = true;
            q.push({i,j});
            
            while(!q.empty()){
                auto 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(vis[x][y] || board[x][y]==0) continue;
                    
                    q.push({x,y});
                    vis[x][y] = true;
                }
            }
        }
    }
    
    if(cnt>=2) return true;
    else return false;
}

bool meltAll() {
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            if(board[i][j] != 0) return false;
    return true;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n >> m;
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            cin >> board[i][j];
    
    while(true){
        // ๋ถ„๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด..
        if(isDivided()) {
            cout << year;
            break;
        }
        
        // (3) ๋‹ค ๋…น์•˜๋‹ค๋ฉด..
        if(meltAll()) {
            cout << 0;
            break;
        }
        
        // (1) ๋ฒกํ„ฐ์— ๋…น์„ ์–ผ์Œ๋“ค์˜ ์ขŒํ‘œ์™€ ์ˆ˜ ๊ธฐ๋กํ•˜๊ธฐ
        vector<tuple<int,int,int>> v;
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(board[i][j] == 0) continue;
                
                int sea=0;
                for(int dir=0; dir<4; dir++){
                    int x = i + dx[dir];
                    int y = j + dy[dir];
                    
                    if(board[x][y] == 0) sea++;
                }
                
                v.push_back({i,j,sea});
            }
        }
        
        // (2) ๋…น์ด๊ธฐ..
        for(int i=0; i<v.size(); i++){
            int x,y,melt;
            tie(x,y,melt) = v[i];
            board[x][y] -= melt;
            if(board[x][y] < 0 ) board[x][y] = 0; // ์–ผ์Œ ๋†’์ด๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•œ๋‹ค.
        }
        
        year++;
    }
    
    return 0;
}

/*
 */
๋ฐ˜์‘ํ˜•