algorithm

BOJ 3197

rkawk 2024. 3. 24. 12:38

๋ฌธ์ œ

๋”๋ณด๊ธฐ

๋ฐฑ์กฐ์˜ ํ˜ธ์ˆ˜ ์„ฑ๊ณต๋‹ค๊ตญ์–ด

๋‘ ๋งˆ๋ฆฌ์˜ ๋ฐฑ์กฐ๊ฐ€ ํ˜ธ์ˆ˜์—์„œ ์‚ด๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ๋‘ ๋งˆ๋ฆฌ๋Š” ํ˜ธ์ˆ˜๋ฅผ ๋ฎ๊ณ  ์žˆ๋Š” ๋น™ํŒ์œผ๋กœ ๋งŒ๋‚˜์ง€ ๋ชปํ•œ๋‹ค.

ํ˜ธ์ˆ˜๋Š” ํ–‰์ด R๊ฐœ, ์—ด์ด C๊ฐœ์ธ ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด๋‹ค. ์–ด๋–ค ์นธ์€ ์–ผ์Œ์œผ๋กœ ๋ฎ์—ฌ์žˆ๋‹ค.

ํ˜ธ์ˆ˜๋Š” ์ฐจ๋ก€๋กœ ๋…น๋Š”๋ฐ, ๋งค์ผ ๋ฌผ ๊ณต๊ฐ„๊ณผ ์ ‘์ด‰ํ•œ ๋ชจ๋“  ๋น™ํŒ ๊ณต๊ฐ„์€ ๋…น๋Š”๋‹ค. ๋‘ ๊ฐœ์˜ ๊ณต๊ฐ„์ด ์ ‘์ด‰ํ•˜๋ ค๋ฉด ๊ฐ€๋กœ๋‚˜ ์„ธ๋กœ๋กœ ๋‹ฟ์•„ ์žˆ๋Š” ๊ฒƒ๋งŒ (๋Œ€๊ฐ์„ ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค) ์ƒ๊ฐํ•œ๋‹ค.

์•„๋ž˜์—๋Š” ์„ธ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ์žˆ๋‹ค.

...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..... ................. 
      ์ฒ˜์Œ               ์ฒซ์งธ ๋‚              ๋‘˜์งธ ๋‚ 

๋ฐฑ์กฐ๋Š” ์˜ค์ง ๋ฌผ ๊ณต๊ฐ„์—์„œ ์„ธ๋กœ๋‚˜ ๊ฐ€๋กœ๋กœ๋งŒ(๋Œ€๊ฐ์„ ์€ ์ œ์™ธํ•œ๋‹ค) ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค.

๋ฉฐ์น ์ด ์ง€๋‚˜์•ผ ๋ฐฑ์กฐ๋“ค์ด ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š” ์ง€ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์—๋Š” R๊ณผ C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹จ, 1 ≤ R, C ≤ 1500.

๋‹ค์Œ R๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ๊ฐ ๊ธธ์ด C์˜ ๋ฌธ์ž์—ด์ด ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. '.'์€ ๋ฌผ ๊ณต๊ฐ„, 'X'๋Š” ๋น™ํŒ ๊ณต๊ฐ„, 'L'์€ ๋ฐฑ์กฐ๊ฐ€ ์žˆ๋Š” ๊ณต๊ฐ„์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๊ฑธ๋ฆฌ๋Š” ๋‚ ์„ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด

ํƒ์ƒ‰๋ฌธ์ œ์ด๋‹ค.

๊ฒฉ์ž๊ฐ€ 1500 * 1500์ด๊ณ  ๋ฌผ๊ณผ ๋‹ฟ์•„์žˆ๋Š” ์–ผ์Œ์ด ํ•œ ์‚ฌ์ดํด์— ํ•œ์นธ์”ฉ ๋…น๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ ์—ฐ๊ฒฐ๋  ๋•Œ ๊นŒ์ง€ ์–ผ์Œ์„ ๋…น์ด๊ณ  ํƒ์ƒ‰์„ ํ•˜๊ฒŒ๋œ๋‹ค๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๊ฒŒ๋œ๋‹ค.

 

์ฒ˜์Œ์— ์ƒ๊ฐํ–ˆ๋˜ ๋ฐฉ๋ฒ•์€ union-find ๋กœ ์–ผ์Œ์ด ๋…น์„๋•Œ ๋งˆ๋‹ค merge ํ•˜๋Š” ๊ณผ์ •์„ ํ•ด์„œ ๋‘๋งˆ๋ฆฌ์˜ ๋ฐฑ์กฐ์˜ root๊ฐ€ ๊ฐ™์•„์ง€๋Š” ๋ถ€๋ถ„์„ ์ฒดํฌํ•˜๋ฉด ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

path-optimization์„ ์‚ฌ์šฉํ•ด์„œ ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด find ๊ณผ์ •์ด ๊ฑฐ์˜ ์ƒ์ˆ˜์‹œ๊ฐ„์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— R*C * ์ƒ์ˆ˜ ์˜ ์—ฐ์‚ฐํšŸ์ˆ˜๋กœ ๊ณ„์‚ฐ์„ ํ•˜์—ฌ ์‹œ๊ฐ„์€ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ƒ๊ฐํ•œ๋Œ€๋กœ ์ž˜ ํ’€๋ฆฌ์ง€ ์•Š์•„์„œ ๊ทธ๋ƒฅ BFS๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค.

 

์–ด์จŒ๋Š” ๋ฌผ๊ณผ ๋‹ฟ์•„์žˆ๋Š” ์–ผ์Œ์ด ๋…น๋Š” ๊ฒƒ์ด๊ธฐ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ฌผ์— ๋Œ€ํ•ด ํƒ์ƒ‰ํ•˜๊ณ , ๊ทธ ๊ณผ์ •์—์„œ ๋ฌผ๊ณผ ๋‹ฟ์•„์žˆ๋Š” ์–ผ์Œ์„ ์ฒดํฌํ•ด ๋‹ค์Œ ๋ฌผ์—๋Œ€ํ•œ BFS ๊ณผ์ •์˜ ์ธ์ˆ˜๋กœ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์˜ ๊ณผ์ •์—์„œ ๋ฐฑ์กฐ๊ฐ€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„๋„ ํƒ์ƒ‰ํ•˜๊ณ , ์–ผ์Œ์ด ๋…น๋Š”๋‹ค๋ฉด ์ถ”๊ฐ€๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ๋‹ค์Œ ๋ฐฑ์กฐ์— ๋Œ€ํ•œ BFS๊ณผ์ •์˜ ์ธ์ˆ˜๋กœ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

 

๋‹จ์ˆœ๊ณ„์‚ฐํ–ˆ์„๋•Œ ํ•œ๋ฒˆ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ถ”๊ฐ€ ๋ฐฉ๋ฌธ์„ ํ•˜์ง€ ์•Š๊ณ , ํ•œ๋ฒˆ์— ์–ผ์Œ์— ๋Œ€ํ•œ ๊ณผ์ •์ด ๋ฌผ์— ๋Œ€ํ•œ BFS, ๋ฐฑ์กฐ์— ๋Œ€ํ•œ BFS์ด๋ฏ€๋กœ 

2*R*C์˜ ์‹œ๊ฐ„์œผ๋กœ ๊ณ„์‚ฐ์„ ํ–ˆ๋‹ค.

 

์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <deque>
#define INTMAX 987654321
using namespace std;
int R, C, check;
string board[1501];
int ans = 0, dx[4]={1,0,-1,0}, dy[4]={0,1,0,-1}, vis[1501][1501];
queue<pair<int,int > > q, q2, sq, sq2;
int main() {
    cin>>R>>C;
    for(int i=0; i<R; i++){
        cin>>board[i];
    }
    for(int i=0; i<R; i++)
        for(int j=0; j<C; j++) {
            if(board[i][j] == '.' || board[i][j] == 'L'){
                q2.push(make_pair(i, j));
            }
            if(board[i][j] == 'L'){
                if(sq2.empty()){
                    sq2.push(make_pair(i, j));
                    vis[i][j] = 1;
                }
            }
        }
        while(!check) {
            while(!q2.empty()){
                q.push(q2.front()); q2.pop();
            }
            while(!sq2.empty()){
                sq.push(sq2.front()); sq2.pop();
            }
            while(!sq.empty() && !check) {
                auto cur = sq.front(); sq.pop();
                for(int i=0; i<4; i++) {
                    int nx = cur.first + dx[i];
                    int ny = cur.second + dy[i];
                    if(nx<0||nx>=R||ny<0||ny>=C) continue;
                    if(vis[nx][ny]) continue;
                    if(board[nx][ny]=='.'){
                        sq.push(make_pair(nx, ny));
                        vis[nx][ny] = 1;
                    }
                    if(board[nx][ny] == 'X'){
                        sq2.push(make_pair(nx, ny));
                        vis[nx][ny] = 1;
                    }
                    if(board[nx][ny] == 'L') {
                        check = 1;
                        break;
                    }
                }
            }
            if(check){
                cout<<ans;
                break;
            }
            while(!q.empty() && !check) {
                auto cur = q.front(); q.pop();
                for(int i=0; i<4; i++) {
                    int nx = cur.first + dx[i];
                    int ny = cur.second + dy[i];
                    if(nx<0||nx>=R||ny<0||ny>=C) continue;
                    if(board[nx][ny] == 'X'){
                        q2.push(make_pair(nx, ny));
                        board[nx][ny] = '.';
                    }
                }
            }
            ans+=1;
        }
}