1. ๋ฌธ์ ์ ๋ํ์ฌ ๐ฆ
- ๋ฌธ์ ๋งํฌ: https://www.acmicpc.net/submit/13460
(1) ์กฐ๊ฑด ๋ถ์ ๐
- ๊ฒฉ์ํ์ ๊ธฐ์ธ์ด๋ฉด, ๊ธฐ์ธ์ด์ง ์ชฝ ๋๊น์ง ์ด๋ํ๋ค. (ํ ์นธ์ฉ x)
- ๋ง์ฝ ๊ตฌ๋ฉ์ผ๋ก Red ๊ตฌ์ฌ, Blue ๊ตฌ์ฌ ๋ ๋ค ๋ค์ด๊ฐ๋ฉด ์ด๊ฑด ์คํจ๋ก ๊ฐ์ฃผํ๋ค.
- ๊ธฐ์ธ์ธ ๊ฑฐ ํ๋ฒ == ์์ง์ ํ ๋ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
2. ์ฝ๋๊ฐ ๋์ค๊ธฐ๊น์ง ๐ ๏ธ
KEY WORD
: ์๋ฎฌ๋ ์ด์
, BFS
๊ฐ๋นก๊ตฌํ ์๋ฎฌ๋ ์ด์ ์ด๋ค. ํ์๊ฐ ๋ดค์ ๋, ๊ตฌํ์ด ์ด๋ ค์ด ํฌ์ธํธ๋ฅผ ์ง์ด๋ดค๋ค.
- ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง
- ๊ธฐ์ธ์ = ์์ง์ ํ ๋ฒ ์ฒดํฌ๋ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง
- ๊ตฌ์ฌ ๋ ๊ฐ๊ฐ ํ๋์ ์ขํ๋ก ๋ชจ์ด๋ ๊ฒฝ์ฐ
- RED๊ฐ ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ์ ๋, Blue๊ฐ ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ์ ๋, ๋ ๋ค ๋ค์ด๊ฐ์ ๋ ์ฒ๋ฆฌ
ํ๋์ฉ ์ดํด๋ณด์.
(1) ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง
์ฐ๋ฆฌ๊ฐ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ด์ ๋ '๊ฐ์ ๊ณ์ฐ์ ๋ฐ๋ณตํ์ง ์๊ธฐ ์ํด์' ์ด๋ค.
์ด๋ฏธ ๋ฐฉ๋ฌธํ ์๋ฆฌ๋ฅผ ๋ค์ ์ ๊ทผํ๋ค๋ฉด, ์ดํ ํ์ ์์ง์์ ์ด๋ฏธ ์ ์ ๊ณ์ฐํ ์์ง์๊ณผ ๋๊ฐ๋ค.
๋ง์ฝ RED
์ BLUE
์ ๋ํด ๋ฐ๋ก ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ฉด ์์ ๋ชฉ์ ์์ ๋ฉ์ด์ง๋ค.
์๋ํ๋ฉด, RED
๊ฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์๋ ์ขํ์ ์์ด๋, BLUE
์ ์์น๊ฐ ์ง๋ ๋ฐฉ๋ฌธ๊ณผ ๋ค๋ฅด๋ค๋ฉด ๋ ๋ค๋ฅธ ์์์ด ํผ์ณ์ง๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ ํ์ ์์ง์์ ์ ํ ๋ค๋ฅธ ์์์ผ๋ก ํผ์ณ์ง๋ค.
๋ฐ๋ผ์, RED
์ BLUE
์ ์์น ์กฐํฉ๋ง๋ค ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ์๋์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋ชฉ์ ๊ณผ ์๋ฏธ๊ฐ ๋ง์์ง๋ค. ์์น ์กฐํฉ๋ง์ ๊ฐ๋ค๋ฉด, ๊ทธ ์ดํ์ ์์์ ์ด๋ฏธ ๊ณ์ฐํ ๋ด์ฉ๊ณผ ๊ฐ์์ง๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์๋ ํด๋น ๊ณ์ฐ์ ์ํด 4์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.check[red ํ ์์น][red ์ด ์์น][blue ํ ์์น][blue ์ด ์์น]
๋ก ๋ํ๋ด์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
(2) ๊ธฐ์ธ์ = '์์ง์ ํ ๋ฒ' ์ฒดํฌ๋ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง
๊ธฐ์กด ํ ์นธ ์ฉ ์์ง์ด๋ BFS๋ฅผ '#'
์ ๋ง๋ ๋๊น์ง ์์ง์ด๋ ๊ฑธ๋ก ๋ฐ๊พธ๋ฉด ๋๋ค.
RED์ BLUE๋ฅผ ๊ฐ๊ฐ ์์ง์ด๊ณ , ๋ ๋ค ๋ฒฝ์ ๋ถ๋ชํ์ ๋, ๊ณ์ฐ์ ๋๋ธ๋ค.
BLUE๋ถํฐ ์์ง์ด๋ ๊ฒ์ด ์ถ๊ฐ boolean flag
๊ฐ ํ์์์ด ์์ํ๋ค, ์๋ํ๋ฉด blue๋ฅผ ๋จผ์ ๊ณ์ฐํ๋๋ฐ, ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ค๋ฉด, ์ ํจํ์ง ์์ ๊ฒฝ์ฐ์ ์์์ผ๋ก, red ๊ตฌ์ ์์ง์๋ถํฐ ๋ค์ ๊ณ์ฐ์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
(3) ๊ตฌ์ฌ ๋ ๊ฐ๊ฐ ํ๋์ ์ขํ๋ก ๋ชจ์ด๋ ๊ฒฝ์ฐ
ํ์ค์์๋ ๋ฒ์ด์ง ์ ์๋ ์ผ์ด์ง๋ง, ์ฐ๋ฆฌ๋ ๊ตฌ์ฌ์ ์์ง์์ (2)๋ฒ๊ณผ ๊ฐ์ด ํํํ๊ธฐ ๋๋ฌธ์, red์ blue๊ฐ ์ผ์ ํต๋ก์ ์กด์ฌํ๋ ๊ฒฝ์ฐ, ๊ฐ์ ๋ฒฝ์ ๋ถ๋ชํ๊ณ , ๊ฐ์ ์ขํ์ ๋์ด๊ฒ ๋๋ค.
##########
#......RB#
##########
์ด๋๋ ์ฌ์ฉํ๋ ๋ฐฉํฅ ๋ฐฐ์ด์ ๊ฐ์ ๋ฐ๋ผ ๋ต์ด ๋ฌ๋ผ์ง๋ค.
์ด์ ์์๋ฅผ ํตํด ์์๋ณด์.
๋ฐ์ ๋์ค๋ ์์๋ค์ ๊ธฐ์ธ์ด๊ธฐ ์ ๋ณด๋์ ๋ชจ์ต์์ ์ ์ํ์.
A. ์ผ์ชฝ์ผ๋ก ๊ธฐ์ธ์ธ ๊ฒฝ์ฐ
##########
#......RB#
##########
์ถ๋ฐ ์์ ์์ ๋ค์ ์๋ ๋
์์ด ๋ฆ๊ฒ ๋์ฐฉํ ๊ฒ์ด๋ฏ๋ก, ํ ์นธ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋์ํจ๋ค.
์์ ์์์์๋ R์ด ๋จผ์ ๋์ฐฉํ๊ณ , B๊ฐ ๋์ฐฉํ ๊ฒ์ด๋, B๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํด์ผํ๋ค.
B. ์ค๋ฅธ์ชฝ์ผ๋ก ๊ธฐ์ธ์ธ ๊ฒฝ์ฐ
##########
#RB......#
##########
์ด ๊ฒฝ์ฐ๋ ๋ฐ๋๋ก, R์ด ์ผ์ชฝ์ผ๋ก ํ ์นธ ์ด๋ํด์ผ ํ ๊ฒ์ด๋ค.
C. ์๋๋ก ๊ธฐ์ธ์ธ ๊ฒฝ์ฐ
###
#R#
#B#
#.#
#.#
#.#
#.#
#.#
#.#
#.#
###
์ด ๊ฒฝ์ฐ๋ ๋ฆ๊ฒ ๋์ฐฉํ ์ชฝ์ด ํ ์นธ ์๋ก ์ฌ๋ผ๊ฐ์ผ ํ๋ค. ์์ ์์์์๋ R์ด ๋งจ ๋ง์ง๋ง์ ์์๋ ์๋ก ํ ์นธ ์์ง์ผ ๊ฒ์ด๋ค.
D. ์๋ก ๊ธฐ์ธ์ธ ๊ฒฝ์ฐ
###
#.#
#.#
#.#
#.#
#.#
#.#
#.#
#R#
#B#
###
์ด์ ๊ฐ์ ์ก์์ ๊ฒ ๊ฐ๋ค. ์์ ๊ฒฝ์ฐ๋ B๋ฅผ ํ ์นธ ๋ด๋ ค์ผ ํ๋ค.
(4) ๊ตฌ๋ฉ์ ๊ตฌ์ฌ์ด ๋ค์ด๊ฐ์ ๋ ์ฒ๋ฆฌ
- ์ค๋ณต์ ์ธ ์ฒ๋ฆฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ชจ๋ ์กฐ๊ฑด์ ๋ฌดํจํ ์ํค๋ BLUE ๋ถํฐ ๊ณ์ฐํ๋ค.
- BLUE๊ฐ ๋ง์ฝ์ ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด, ํ ๊ณ์ฐ์ ์ฆ์ ์ข ๋ฃํ๊ณ ๋ค์ ๊ฒฝ์ฐ์ ์๋ก ๋์ด๊ฐ๋ค.
- RED ๊ณ์ฐ์ ์ด๋ฏธ BLUE๊ฐ ๊ตฌ๋ฉ์ ์ ๋ค์ด๊ฐ์์ด ์ ์ ๋์์์ผ๋ก, ๋ค์ด๊ฐ ๊ฒฝ์ฐ, ์ง๊ธ๊น์ง์ ์์ง์์ ๊ณ์ฐํ์ฌ ๋ต์ ๋ฐํํ๋ค.
(1) ์๊ฐ๋ณต์ก๋ ๋ถ์ โณ
- 10๋ฒ์ ์์ง์ ์ด๋ด๋ก ๊ณ์ฐ๋๋ ๊ฒฝ์ฐ๋ง ๊ตฌํ๋ผ๊ณ ํ์ฌ์, ์๊ฐ๋ณต์ก๋์ tightํจ์ ์๊ตฌํ๋ ๋ฌธ์ ๊ฐ ์๋์๋ค.
- ๋ฐ๋ผ์ ์๊ฐ๋ณต์ก๋ ๋ถ์์ ์๋ตํ๊ฒ ๋ค.
3. ์ฝ๋ ๐
(1) SUDO CODE ๐ฌ
0. ์
๋ ฅ ๋ฐ๊ธฐ
1. BFS ์์
(1) ํ์ฌ red ๊ตฌ์ฌ๊ณผ blue ๊ตฌ์ฌ์ ํ๋์ฉ 4๊ฐ์ ๋ฐฉํฅ๋ฐฐ์ด ๋๊น์ง ์์ง์ฌ๋ณด๊ธฐ
(2) ๋ง์ฝ BLUE๊ฐ ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ค๋ฉด ํ ๊ณ์ฐ์ ์ข
๋ฃํ๊ณ ๋ค์ ๊ฒฝ์ฐ์ ์ ๊ณ์ฐ์ผ๋ก ๋์ด๊ฐ๋ค.
(3) ๋ง์ฝ RED๊ฐ ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ค๋ฉด ์ด์ ๊น์ง์ ์์ง์ ์๋ฅผ ์ ์ฅํ๊ณ BFS๋ฅผ ์ข
๋ฃํ๋ค.
(4) ์๋ฌด๊ฒ๋ ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ์ง ์์๋ค๋ฉด ๋ค์์ ๊ณ์ฐํ๋ค.
a. ๊ตฌ์ฌ์ด ๊ฐ์ ์ขํ์ ์๋์ง ํ์ธ ํ, ์ฌ์ฉํ ๋ฐฉํฅ ๋ฐฐ์ด์ ๋ฐ๋ผ ์ฌ๋ฐ๋ฅธ ์์น๋ก ์กฐ์
b. ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์์น ์กฐํฉ์ด๋ฉด ๋ค์ ๊ณ์ฐ ์ํ๊ณ ๋ค์ ๊ฒฝ์ฐ์ ์ ๊ณ์ฐ์ผ๋ก ๋์ด๊ฐ๊ธฐ
c. ํ ์์น ์กฐํฉ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๊ณ bfs queue์ ๋ฃ๊ธฐ
(2) JAVA CODE โ
import java.util.*;
import java.io.*;
public class Main {
static int R,C;
static int answer = Integer.MAX_VALUE;
static boolean [][][][] check;
static char [][] board;
static int [][] dir = new int [][] {{0,1},{0,-1},{1,0},{-1,0}}; // ๋,์,๋จ,๋ถ
static class Bead {
int rx;
int ry;
int bx;
int by;
int cnt;
public Bead() {
this.cnt = 0;
};
public Bead(int rx, int ry, int bx, int by) {
this.rx = rx;
this.ry = ry;
this.bx = bx;
this.by = by;
this.cnt = 0;
};
public Bead(int rx, int ry, int bx, int by, int cnt){
this.rx = rx;
this.ry = ry;
this.bx = bx;
this.by = by;
this.cnt = cnt;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
board = new char [R][C];
Bead start = new Bead();
for(int i = 0; i < R; i++){
String row = br.readLine();
for(int j = 0; j < C; j++){
board[i][j] = row.charAt(j);
if(board[i][j] == 'R') {start.rx = i; start.ry = j;}
if(board[i][j] == 'B') {start.bx = i; start.by = j;}
}
}
bfs(start);
System.out.println(answer>10? -1 : answer);
}
public static void bfs(Bead start) {
ArrayDeque<Bead> aq1 = new ArrayDeque<>();
check = new boolean [R][C][R][C];
check[start.rx][start.ry][start.bx][start.by] = true;
aq1.add(start);
while(!aq1.isEmpty()){
Bead now = aq1.poll();
LOOP:
for(int i = 0; i < 4; i++){
int nrx = now.rx;
int nry = now.ry;
int nbx = now.bx;
int nby = now.by;
int dx = dir[i][0];
int dy = dir[i][1];
while(!OOB(nbx+dx, nby+dy)){
nbx += dx;
nby += dy;
if(board[nbx][nby] == 'O') continue LOOP;
}
while(!OOB(nrx+dx, nry+dy)){
nrx += dx;
nry += dy;
if(board[nrx][nry] == 'O') {
answer = Math.min(answer, now.cnt+1);
return;
}
}
if(nrx == nbx && nry == nby) {
switch (i){
case 0: {
if(now.ry < now.by) nry -= 1;
else nby -= 1;
break;
}
case 1: {
if(now.ry < now.by) nby += 1;
else nry += 1;
break;
}
case 2: {
if(now.rx < now.bx) nrx -= 1;
else nbx -= 1;
break;
}
case 3: {
if(now.rx < now.bx) nbx += 1;
else nrx += 1;
break;
}
}
}
if(check[nrx][nry][nbx][nby]) continue;
check[nrx][nry][nbx][nby] = true;
aq1.add(new Bead(nrx, nry, nbx, nby, now.cnt+1));
}
}
}
private static boolean OOB(int r, int c){
return r < 0 || c < 0 || r >= R || c >= C || board[r][c] == '#';
}
}
4. ํธ๋ฌ๋ธ ์ํ or ๋ฐฐ์ด ์ ๐
- ์๋ ์ผ์ฑ SW ์ญ๋ํ ์คํธ ๋ฌธ์ ์๋ค๋๋ฐโฆ ใทใทใท ๊ฐ์ด๋ ต๊ตฐโฆ