1. ๋ฌธ์ ์ค๋ช ๐
(1) ๋งํฌ๐
https://www.acmicpc.net/problem/3197
(2) ํด์ค๐ต
๋ฌธ์ ๊ฐ ์ง๊ด์ ์ด๋ผ์ ํจ์ค
2. ์๊ฐ์ ํ๋ฆ: ์ฝ๋๊ฐ ๋์ค๊ธฐ๊น์ง ๐๏ธ
(1) IDEA ๋์ถ๐ก
KEY WORD
: BFS
+ ์ค๋ BFS ๋๋ฆด Queue๊ณผ ๋ด์ผ ๋๋ฆด Queue ๊ตฌ๋ถ!
์ธ๋ป ๋ณด๋ฉด, ๊ทธ๋ฅ ๋ฒฝ๋ถ์๊ณ ์ด๋ํ๊ธฐ ๊ฐ์ ๋ฌธ์ ์ฒ๋ผ ๋งค๋ฒ BFS๋ฅผ ๋จ์ํ ๋๋ฉด ๋๋ค๊ณ ์๊ฐํ๊ธฐ ์ฝ์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด ๋๋ฌธ์ ๋ ๊น๊ฒ ์๊ฐํด๋ด์ผ ํ๋ค.
- ํ๊ณผ ์ด์ ์ต๋๊ฐ 1500์ด๋ฏ๋ก, ์ด๋ ๊ฒ ํ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค.
- ํ๋ฃจ๊ฐ ๊ตฌ๋ถ๋์ด, ์ ํด์ง ์๋งํผ๋ง BFS๋ฅผ ๋๋ค.
ํ์์ ๊ฒฝ์ฐ 1๋ฒ์ ๊ฐ๊ณผํ์ฌ ์๊ฐ์ด๊ณผ๋ฅผ ๋์ผ๋ฉฐ, ๋ ๋ฒ์งธ๋ฅผ ๊ฐ๊ณผํ์ฌ ์ดํ ํ๋ ธ์ต๋๋ค. ์ค๋ฅ๋ ๋ด์๋ค. ์์ธํ ํธ๋ฌ๋ธ ์ํ ์ ํ ํฌ์คํ ๋งจ ํ๋จ์ ๊ธฐ๋กํด ๋๊ฒ ๋ค.
๋ฐ๋ผ์ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
๋งค์ผ ์ผ์ ๋ น์ด๊ธฐ ๊ด๋ จ
- ํ๋ฃจ๋ง๋ค ๋
น๋ ์ผ์์ด ์ ํด์ ธ ์๊ธฐ์ ์ค๋ ํ ๋น๋ ๋งํผ๋ง BFS๋ฅผ ๋์์ผ ํ๋ค.
- ์ด๋ฅผ ์ํด ์ค๋ ๋ น์ ์ผ์ ํ๋ก ํ BFS๋ฅผ ์งํํ๊ณ , ๋ด์ผ ๋ น์ ์ผ์๋ค์ nextQ์ ์๋ก ๋ด์๋๋๋ค.
- ์ค๋์ ํ๋งํผ BFS๊ฐ ๋๋๋ฉด, ์ด์ ๋ค์ ๋ ์ด ๋ฐ์ ๊ฒ์ด๋ฏ๋ก ์ค๋์ ํ๋ nextQ๋ก ๋์ฒด๋๋ค.
๋ฐฑ์กฐ ์์ง์ด๊ธฐ ๊ด๋ จ
- ๋ฐฑ์กฐ ๋ํ ์ค๋ ๋
น์ ์ผ์๊น์ง๋ง ๋ ๊ฐ ์ ์๋ค.
- ์ค๋ ๊ฐ ์ ์๋ ์ต๋์น๊น์ง ๊ฐ๋ค.
- ์ค๋์ ๊ฒฝ๊ณ์ (์ฆ ์ผ์๊ณผ ๋ง๋๋ ์ง์ ์ ๋ฐฑ์กฐ ์ขํ)๋ฅผ ๋ด์ผ์ ํ์ ์ง์ด๋ฃ๋๋ค.
- BFS๊ฐ ๋๋๋ฉด ์ค๋์ ํ๋ฅผ ๋ด์ผ์ ํ๋ก ๋์ฒดํ๋ค.
(2) SUDO CODE ๐
+ 0. init()
- (1) ๋ฐฐ์ด์ ์ด๊ธฐํ ํ๋ค.
- (2) ๋ฌผ์ธ ์ง์ , ๋ฐฑ์กฐ๊ฐ ์กด์ฌํ๋ ์ขํ๋ ๊ฐ๊ฐ ์ค๋์ ์ผ์ ๋
น์ด๊ธฐ ํ์ ์ค๋์ ๋ฐฑ์กฐ ์์ง์ด๊ธฐ ํ์ ์ง์ด ๋ฃ๋๋ค.
- (3) ๋ฐฑ์กฐ ๋ ๊ฐ ๊ตฌ๋ถํด์ ํ์ (๋ง๋ฌ๋์ง ์๋์ง ํ์ธ ์ํจ)
+ 1. ๋ค์์ ๋ฐ๋ณตํด์ ์งํํ๋ค.
- (1) ์ค๋ ๊ฐ๋ฅํ ์ผ์์ ๋
น์ธ๋ค.
- (2) ์ค๋ ๊ฐ๋ฅํ ๋ฐฑ์กฐ๋ฅผ ์์ง์ธ๋ค.
- (3) ๋ฐฑ์กฐ ๋์ด ๋ง๋ฌ๋๊ฐ? ๋ง๋๋ฉด ๋ฐ๋ณต ํ์ถ, ์๋๋ฉด ๋ค์ 1๋ก ๋์๊ฐ
+ 2. ๋ต ์ถ๋ ฅ
- 1๋ฒ์ ๋ฐ๋ณตํ ํ์๋ฅผ ์ถ๋ ฅ
ํจ์ ์๊ฐ
+ 1. ์ค๋์ ์ผ์ ๋
น์ด๊ธฐ
- (0) ํ ํ์ฌ์ด์ฆ๊ฐ ์ค๋ ๋
น์ผ ์ผ์์ ์์ด๋ฏ๋ก, ๊ทธ๋งํผ๋ง BFS๋ฅผ ๋๋ค.
- (1) ๋ฌผ๊ณผ ๊ทผ์ ํ ์ผ์์ ๋ง๋๋ฉด, ์ด์ ์ด ๊ณณ์ด ๋ด์ผ์ ์ถ๋ฐ์ ์ด ๋๋ฏ๋ก ๋ด์ผ์ ์ผ์ ํ์ ๋ฃ๊ธฐ
- (2) ๋ด์ผ์ ํ๋ก ์ค๋์ ํ๋ฅผ ๊ฐ์
+ 2. ์ค๋์ ๋ฐฑ์กฐ ์์ง์ด๊ธฐ
- ์์ ์ผ์์ธ์ง ๋ฐฑ์กฐ์ธ์ง๋ง ๋ค๋ฅด์ง ๋ก์ง ๊ฐ์
(3) ์๊ฐ๋ณต์ก๋ ๋ถ์ ๐
์์์ ์ด์ค ๋ฐ๋ณต๋ฌธ์ ํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ํ ํ์ด๋ ์ผ์๊ณผ์ ์ ๊ฒฝ์ง์ญ ๋ง ๋ค์ ๋์ ํด์ ํ์ธํ๋ค.
๋ฐ๋ผ์ ๋ฐ๋ณต๋ฌธ ์ ์ฒด๋ฅผ ๋๋ ค๋ ๋ฐฐ์ด ์ ์ฒด๋ฅผ ๋ฑ ํ ๋ฒ ํ์ธํ๋ ๊ฒ์ด๋ฏ๋ก,
$$ O(R * C) $$
์ด๋ค.
3. ๊ตฌํ ์ฝ๋ ๐
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int R, C;
static char [][] field;
static boolean [][] isVisited;
static int [][] dir = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};
static ArrayDeque<Coordinate> melting_spot = new ArrayDeque<>();
static ArrayDeque<Coordinate> swan_1 = new ArrayDeque<>();
static class Coordinate {
int r;
int c;
public Coordinate (int r, int c){
this.r = r;
this.c = c;
}
}
public static void main(String[] args) throws IOException {
init();
int cnt = 0;
while (true) {
cnt++;
melting();
if(swan_fill(true)) break;
}
System.out.println(cnt);
}
public static void init() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
field = new char[R][C];
isVisited = new boolean[R][C];
int cnt = 0;
for (int i = 0; i < R; i++) {
String row = br.readLine();
for (int j = 0; j < C; j++) {
field[i][j] = row.charAt(j);
if(row.charAt(j) != 'X') melting_spot.add(new Coordinate(i,j));
if(row.charAt(j) == 'L') {
if(cnt == 0) {
field[i][j] = '1';
swan_1.add(new Coordinate(i,j));
}
else field[i][j] ='2';
cnt++;
}
}
}
}
public static void melting() {
int qSize = melting_spot.size();
for (int i = 0; i < qSize; i++) {
Coordinate now = melting_spot.poll();
for (int j = 0; j < 4; j++) {
int nextR = now.r + dir[j][0];
int nextC = now.c + dir[j][1];
if(!OOB(nextR,nextC) && field[nextR][nextC] == 'X'){
field[nextR][nextC] = '.';
melting_spot.add(new Coordinate(nextR, nextC));
}
}
}
}
public static boolean swan_fill(boolean isOne) {
char fill = '1';
char opposite ='2';
ArrayDeque<Coordinate> now_aq1 = swan_1;
ArrayDeque<Coordinate> next_aq = new ArrayDeque<>();
while (!now_aq1.isEmpty()) {
Coordinate now = now_aq1.poll();
for (int i = 0; i < 4; i++) {
int nextR = now.r + dir[i][0];
int nextC = now.c + dir[i][1];
if(!OOB(nextR,nextC)&& !isVisited[nextR][nextC] &&field[nextR][nextC] != 'X') {
if(field[nextR][nextC] != opposite){
field[nextR][nextC] = fill;
isVisited[nextR][nextC] = true;
now_aq1.add(new Coordinate(nextR,nextC));
}else {
return true;
}
}
if ((!OOB(nextR,nextC)&& !isVisited[nextR][nextC] &&field[nextR][nextC] == 'X')){
isVisited[nextR][nextC] = true;
next_aq.add(new Coordinate(nextR,nextC));
}
}
}
swan_1 = next_aq;
return false;
}
public static boolean OOB (int r, int c) {
return !(r >= 0 && r < R && c >= 0 && c < C);
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
๋ด๊ฐ ํ๋ฆฌ๊ฒ ์๊ฐํ๋ ๊ณผ์ ๊ณผ ๊ทธ๊ฒ์ด ํ๋ฆฐ ์ด์ ํธ๋ฌ๋ธ ์ํ ์ ์ ์ด๋๊ฒ ๋ค.
A. ์ฒซ ํ์ด (์๊ฐ ์ด๊ณผ)
๋ค์๊ณผ ๊ฐ์ด ๋ชจ๋ํ ํด์ ํ์๋ค.
+ 1. ์ด๊ธฐํ ํจ์
+ 2. ๋ฌผ ๊ทผ์ ์ผ์ ์ฐพ๊ธฐ ํจ์
- (1) ์ด์ค for ๋ฌธ ๋ฃจํ ๋๋ฉด์ . ์ฐพ์ผ๋ฉด ๊ฑฐ๊ธฐ์ ๋ถํฐ BFS, ์ผ์ ๋ง๋๋ฉด 'N'
+ 3. ๋ฌผ ๊ทผ์ ์ผ์ ๋
น์ด๊ธฐ ํจ์
- (1) ์ด์ค for ๋ฌธ ๋๋ฉด์ N์ .์ผ๋ก ๋ฐ๊พธ๊ธฐ (์ด๋ฌ์ง ์์ผ๋ฉด BFS๊ฐ ์ด์ BFS ๋
น์ธ ๊ฑฐ ์ค์ฒฉํด์ ๋ค ์ง์๋ฒ๋ฆผ)
+ 4. ๋ฐฑ์กฐ๋ผ๋ฆฌ ๋ฟ๋์ง ํ์ธํ๋ ํจ์
+ 5. 2~4๋ฒ์ ๋ฐฑ์กฐ๋ผ๋ฆฌ ๋ง๋ ๋๊น์ง ๋ฐ๋ณต -> ๋ง๋๋ฉด ์ง๊ธ๊น์ง์ ๋ฐ๋ณต ํ์ ์ถ๋ ฅ
์๊ฐ ์ด๊ณผ ๋ฌ๋ค. ์๊ฐ๋ณต์ก๋๋ฅผ ๊ณ์ฐํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- 2,3,4๊ฐ ์ฐ์์ ์ด์ง ์๋๋ผ๋ ์ ๋ถ $O(R*C)$
- ์ด๊ฑธ ๋ฐฑ์กฐ๋ผ๋ฆฌ ๋ง๋๋ ๋ ๊น์ง ๋ฐ๋ณต $O(log(R*C))$
- R*C ๋ ์ต๋ 2,250,000 ๊ฐ์ด๋ค.
- ๋ฐ๋ผ์ ์ต์ข ๋น ์ค๋ O(log(RC) * RC)๊ฐ ๋๋ฏ๋ก $10^9$ ~ $10^{10}$ ์ฌ์ด์ด๋ค.
B. ๋๋ฒ์งธ ํ์ด (ํ๋ฆผ)
์ด๋ฒ์ ๋ฐฉ๋ฒ์ ๋ฐ๊ฟ์ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ค.
+ 1. ์ด๊ธฐํ
- (1) ์ด๊ธฐํ ์, swan_fill ํจ์๋ฅผ ํตํด, ์ต์ด ์์ ์์ swan์ด ๊ฐ์ ์๋ ๊ณณ๊น์ง ์ฒดํฌ (์์ชฝ์์ ์ ๋ถ)
- ์ผ์ ๊ฒฝ๊ณ์ง์ ์ ์๋ ๋ฐฑ์กฐ์ ๊ฐ๋ฅํ ์ขํ๋ฅผ ์ ๋ถ swan_1, swan_2 ํ์ ๊ตฌ๋ถํด์ ์ง์ด๋ฃ๋๋ค.
- (2) ์์ ์ ์ขํ๋ ์ผ์์ด๋ฉด์ ์ฌ๋ฐฉ ํ์ ์ ๋ฐฑ์กฐ๋ ๋ฌผ์ด ์๋ค? -> ๋
น์ ์ผ์ = melting_spot ํ์ ์ง์ด๋ฃ๋๋ค.
+ 2. ๋ค์์ ๋ฐ๋ณต
- (1) ๋ฌผ ๊ทผ์ ์ผ์ ๋
น์ด๊ธฐ ํจ์: ์ต์ด ํ ํฌ๊ธฐ๋งํผ๋ง BFS ์งํ (๊ธ๋ฐฉ meltiong_spot์ ๋ค์ด๊ฐ ์๋ ๊ฑธ ๋
น์ด๊ณ , ๋
น์ ๊ฑฐ ๊ธฐ์ค ๋ ๊ทผ์ ํ ๊ฒ์ queue ์ ๋ฃ์)
- (2) ๋ฐฑ์กฐ ๋๋ง๋ฆฌ ์ด๋์ํค๊ธฐ ํจ์: ๊ธ๋ฐฉ 1-(1)์์ ์ง์ด๋ฃ์๋ ๋ฐฑ์กฐ์ ์ขํ๋ก BFS, ๋ ๊ฐ ์ ์๋ ๊ณณ ์ฒดํฌ
- (ํ ํฌ๊ธฐ๋งํผ๋ง ์งํ + ์ผ์ ์ธ์ ๋ฐฑ์กฐ๋ ๋ ๋ค์ queue์ ๋ฃ๋๋ค.)
- (3) ๋ง์ฝ (2) ํ๋ค๊ฐ ๋ง๋๋ฉด ํจ์ ์ข
๋ฃ, ํ์ฌ๊น์ง ๋ฐ๋ณตํ์ ์ถ๋ ฅ
ํด๋น ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ํ๋ ธ๋ค.
- ํ์ฌ ์์ ์ค์ธ ํ์ ํ์ฌ ์์ ํด์ผ ํ๋ ๊ฑฐ, ๋ค์๋ ์์ ํด์ผ ํ๋ ๊ฑฐ ํผ์ฉํด์ ๋ฃ์ -> ์ด ๋๋ฌธ์ ์ค๋ฅ๊ฐ ์ ์ผ์ด๋จ.
- ๋ฐฑ์กฐ ๊ธฐ์ค, ์ผ์ ๋ง๋ ๋๊น์ง BFS ๋๋ ํจ์, ํ ํ ์ฌ์ด์ฆ๋งํผ๋ง ๋๋ ํจ์ ๋ฐ๋ก ๋ง๋ค์ด์ ์ฌ์ฉ -> ๋ณต์ก๋ ์ฌ๋ผ๊ฐ
์ด๋ชจ์ง ๋ชจ์: ๐ค, โ โจ 0๏ธโฃ1๏ธโฃ2๏ธโฃ3๏ธโฃ4๏ธโฃ5๏ธโฃ6๏ธโฃ7๏ธโฃ8๏ธโฃ9๏ธโฃ๐