BOJ 3197
๋ฌธ์
๋ฐฑ์กฐ์ ํธ์ ์ฑ๊ณต๋ค๊ตญ์ด
๋ ๋ง๋ฆฌ์ ๋ฐฑ์กฐ๊ฐ ํธ์์์ ์ด๊ณ ์์๋ค. ๊ทธ๋ ์ง๋ง ๋ ๋ง๋ฆฌ๋ ํธ์๋ฅผ ๋ฎ๊ณ ์๋ ๋นํ์ผ๋ก ๋ง๋์ง ๋ชปํ๋ค.
ํธ์๋ ํ์ด 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;
}
}