https://www.acmicpc.net/problem/13460
๋ฌธ์
- ๊ฒ์์ ๋ชฉํ๋ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด์ ๋นผ๋ด๋ ๊ฒ์ด๋ค. ์ด๋, ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ฉด ์ ๋๋ค.
- ๋ณด๋์์ ์ผ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์ค๋ฅธ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์๋์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ์ ๊ฐ์ ๋ค ๊ฐ์ง ๋์์ด ๊ฐ๋ฅ
- ๊ณต์ ๋์์ ์์ง์ธ๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์ฑ๊ณต์ด์ง๋ง, ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์คํจ์ด๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ด ๋์์ ๊ตฌ๋ฉ์ ๋น ์ ธ๋ ์คํจ
- ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ๋์์ ๊ฐ์ ์นธ์ ์์ ์ ์๋ค.
- ์ธ๋ก, ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ ๋ ์ ์ N, M (3 ≤ N, M ≤ 10)
- '.'์ ๋น ์นธ, '#'์ ๊ณต์ด ์ด๋ํ ์ ์๋ ์ฅ์ ๋ฌผ ๋๋ ๋ฒฝ, 'O'๋ ๊ตฌ๋ฉ์ ์์น, 'R'์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ์์น, 'B'๋ ํ๋ ๊ตฌ์ฌ์ ์์น
- ๋ณด๋์ ๊ฐ์ฅ์๋ฆฌ์๋ ๋ชจ๋ '#', ๊ตฌ๋ฉ์ ๊ฐ์๋ ํ ๊ฐ, ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํญ์ 1๊ฐ
- ์ต์ ๋ช ๋ฒ ๋ง์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์๋์ง ์ถ๋ ฅํ๋ค. ๋ง์ฝ, 10๋ฒ ์ดํ๋ก ์์ง์ฌ์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์์ผ๋ฉด -1์ ์ถ๋ ฅ
๊ตฌ์ฌ ํ์ถ(https://www.acmicpc.net/problem/13459)์ ์กฐ๊ธ ๋ฐ์ ๋ ๋ฒ์ ์ด๋ค. ์ด๋ฏธ ๊ตฌ์ฌ ํ์ถ1์ ํ์๋ค๋ฉด ์ฝ๊ฐ์ ์์ ์ ํตํด ๋ฐ๋ก ์ ์ถํ ์ ์๋ ๋ฌธ์ ์ด๋ค.
๊ทธ๋์ ํ์ด๋ ๊ตฌ์ฌ ํ์ถ์ ํ์ด ํฌ์คํ (https://programmingiraffe.tistory.com/136)์ ์๋ ๊ฑธ ๊ฑฐ์ ๋ณต์ฌํด ์๋ค.
ํ์ด
๊ฐ ์นธ์ด ์๊ณ , ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, ์, ์๋๋ก ์ด๋ํ๋ ๋ค ๊ฐ์ง ๋์์ด ์๊ณ , ์์ง์ด๋ ํ์๋ฅผ ์์์ผ ํ๋ฏ๋ก ๊ทธ๋ํ ํ์ ๋ฌธ์ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ 1ํ, 2ํ, 3ํ..10ํ ์์ง์ด๊ธฐ๋ก ๋ด์ผํ๋ฏ๋ก BFS(๋๋น์ฐ์ ํ์) ๋ฌธ์ ์ด๋ค.
๊ธฐ์กด์ BFS๋ฅผ ํ์ฉํ ํ์ ์ ํ์์ ์ฌํ๋ ํ์ด๊ฐ ์๊ตฌ๋๋ค. '๊ตฌ์ฌ์ด ๋์์ ์์ง์ธ๋ค๋ ๊ฒ'๊ณผ 'ํ ์นธ๋ง ์์ง์ด๋ ๊ฒ์ด ์๋๋ผ ํ ๋ฐฉํฅ์ผ๋ก ๊ณ์ ์์ง์ธ๋ค๋ ๊ฒ', ์ฑ๊ณต๊ณผ ์คํจ ์กฐ๊ฑด์ด ๊น๋ค๋กญ๋ค๋ ๊ฑฐ..
- ๊ณต์ด ๋์์ ์์ง์ธ๋ค๊ณ ํ์ง๋ง.. ํ๋์ ๋จผ์ ๊ตด๋ ค์ผ ํ๋ค!
- ๊ฐ์ ์นธ์๋ ์์ ์๋ ์๊ณ , ํ๋ ๊ตฌ์ฌ์ด ๋จผ์ ๋น ์ง๊ฑฐ๋, ๋ ๊ตฌ์ฌ์ด ๋์์ ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๊ฒ ๋๋ฉด ์คํจ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๋ ๊ตฌ์ฌ์ ๊ตด๋ฆฌ๋ ๋์์
- 1) ๋นจ๊ฐ ๊ตฌ์ฌ์ด ์๋์ง ํ์ธํ๋ค.
- ์์ ๋นจ๊ฐ ๊ตฌ์ฌ์ด ์๋ค๋ฉด, ๋จผ์ ๊ตด๋ฆฌ๋๋ผ๋ ์ต์ข ์์น๋ ๋นจ๊ฐ ๊ตฌ์ฌ๋ณด๋ค ํ ์นธ ๋ค๊ฐ ๋์ด์ผ ํ๋ค.
- 2) ๊ตฌ๋ฉ์ ๋น ์ง๋์ง ํ์ธํ๋ค.
- ํ์ง๋ง ๋น ์ง๋ค๊ณ ๊ฒ์์ ์ข ๋ฃ์ํค๋ฉด ์๋๋ค. ํ๋์ ๊ตฌ์ฌ์ด ๋จผ์ ๋น ์ ธ๋, ๋ค์ ํ์๋ ์ฑ๊ณตํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- 1) ๋นจ๊ฐ ๊ตฌ์ฌ์ด ์๋์ง ํ์ธํ๋ค.
- ๊ฐ์ ์นธ์๋ ์์ ์๋ ์๊ณ , ํ๋ ๊ตฌ์ฌ์ด ๋จผ์ ๋น ์ง๊ฑฐ๋, ๋ ๊ตฌ์ฌ์ด ๋์์ ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๊ฒ ๋๋ฉด ์คํจ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๋ ๊ตฌ์ฌ์ ๊ตด๋ฆฌ๋ ๋์์
5 5
#####
#..R#
#.#.#
#BO.#
#####
(1ํ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ธฐ์ธ์ธ๋ค๋ฉด ํ๋์ด ๋น ์ง๋ค. ํ์ง๋ง ์๋, ์ผ์ชฝ ์์ผ๋ก ์์ง์ธ๋ค๋ฉด ๋นจ๊ฐ ๊ตฌ์ฌ์ ๋ฃ๋๊ฒ ๊ฐ๋ฅํ๋ค.)
- ์ข
๋ฃ ์กฐ๊ฑด
- ํ๋ ๋จผ์ ์ด๋ํ๊ณ ๋นจ๊ฐ ๊ตฌ์ฌ์ ์ด๋์ํฌ ๋, ๋นจ๊ฐ ๊ตฌ์ฌ์ด ๋น ์ง -> ๋ฆฌํด : ์ด๋ ํ์
- ์ด๋ ํ์๊ฐ 10ํ๊ฐ ๋์ -> ๋ฆฌํด : -1
- ํ์ ๋ค์ด๊ฐ ์์๊ฐ ์์ ex) ๊ฐํ ๊ฒฝ์ฐ -> ๋ฆฌํด : -1
- ํ๋ ๊ตฌ์ฌ์ด ๋จผ์ ๋น ์ง -> ๋ฐ๋ก ๋ฆฌํด์ ์ค ์ ์๋ค. ๋ค์ ํ์์์ ์ฐพ์ ์๋ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ ๋๊ธด๋ค. ์ด์ฐจํผ ๋ค์์ ๋นจ๊ฐ์ ๋ชป์ฐพ์ผ๋ฉด ์ด๋ ํ์๊ฐ 10ํ ์ด๊ณผํด ๋๋๊ฒ ๋์ด์๋ค.
- ํ ๊ตฌํ
- ๊ณต์ ๋์์ ์์ง์ด๋ฏ๋ก, ํ๋ ๊ตฌ์ฌ๊ณผ ๋นจ๊ฐ ๊ตฌ์ฌ์ ์ขํ๋ฅผ Point๋ผ๋ ๊ฐ์ฒด๋ก ์์ฑํด ํ์ ๋ฃ์๋ค.
- ๊ตฌ์ฌ์ ๊ตฌ๋ถ์์ด ํตํฉํด์ ํ์ ๋ ๋ฒ ๋ฐ๋ก ๋ฃ์ ์๋ ์์ง๋ง, ๊ตฌ์ฌ์ ๊ตด๋ฆฌ๊ฒ ๋ ๋ 2๊ฐ์ฉ ๋์ด์ ๋นผ์ฃผ๋ ์์ ์ด ๋ณ๋๋ก ๋ค์ด๊ฐ์ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ ๋ ํธํ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
- Point(bx, by, rx, ry)
- ๊ณต์ ๋์์ ์์ง์ด๋ฏ๋ก, ํ๋ ๊ตฌ์ฌ๊ณผ ๋นจ๊ฐ ๊ตฌ์ฌ์ ์ขํ๋ฅผ Point๋ผ๋ ๊ฐ์ฒด๋ก ์์ฑํด ํ์ ๋ฃ์๋ค.
- ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์ด
- visited[bx][by][rx][ry] : 4์ฐจ์์ ๋ฐฐ์ด๋ก ํํํด์ค๋ค.
- ํ๋(1, 2)์ ๋นจ๊ฐ(1, 1)์ ์ด์ ์ ๋ฐฉ๋ฌธํ๊ณ , ๋ค์์๋ ํ๋(1, 2)์ ๋นจ๊ฐ(3, 1)์ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์. ํ๋์ด ์ด์ ์ (1, 2)์ ๋ฐฉ๋ฌธํ์ด๋, ๋นจ๊ฐ์ ์ขํ๊ฐ ๋ค๋ฅด๋ฏ๋ก ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์๋ก ๋ด์ผ ํ๋ค.
- ํ์ ๊ณ์ฐ
- ํ์์ ๊ฐ์ฒด๋ฅผ ๋ฝ์ ์ฌ๋ฐฉํ์์ ํ๊ธฐ ์ , ํ์ size๋ฅผ ๊ณ์ฐํด ๊ทธ๋งํผ๋ง ํ์์ ๋๋ฆฌ๋๋ก ํ๋ค.
- ํ์ ๊ณ์ฐ์ ๊ฐ์ฒด์ ๋ฐ๋ก ๋ณ์๋ฅผ ๋ฌ์ ํ์ ๋ฃ์ ๋๋ง๋ค +1 ํด์ ํ ์๋ ์๋ค.
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int N, M;
static char[][] board;
static boolean[][][][] visited;
static int[] dx = { -1, 1, 0, 0 };
static int[] dy = { 0, 0, -1, 1 };
static class Point {
int bx, by, rx, ry; // ํ๋ ํ๋ ฌ ์ขํ, ๋นจ๊ฐ ํ๋ ฌ ์ขํ
Point() {};
Point(int bx, int by, int rx, int ry) {
this.bx = bx;
this.by = by;
this.rx = rx;
this.ry = ry;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
board = new char[N][M];
Point start = new Point(); // ๊ตฌ์ฌ์ ์์ ์์น
for (int i = 0; i < N; i++) {
board[i] = br.readLine().toCharArray();
// ๊ตฌ์ฌ๊ณผ ๊ตฌ๋ฉ์ ์์น ์ ์ฅ
for (int j = 0; j < M; j++) {
if (board[i][j] == 'R') {
start.rx = i;
start.ry = j;
} else if (board[i][j] == 'B') {
start.bx = i;
start.by = j;
}
}
}
// ์ฒ๋ฆฌ, ๊ฒฐ๊ณผ
visited = new boolean[N][M][N][M]; // ํ๋, ๋นจ๊ฐ
System.out.println(bfs(start));
}
public static int bfs(Point start) {
Queue<Point> queue = new LinkedList<>();
queue.add(start);
visited[start.bx][start.by][start.rx][start.ry] = true;
int count = 0;
while (!queue.isEmpty()) {
count++;
if (count > 10) { // 10ํ ๋์ผ๋ฉด ์ข
๋ฃ
return -1;
}
int size = queue.size();
for(int s = 0; s < size; s++) {
Point point = queue.poll();
for (int d = 0; d < 4; d++) {
int nbx = point.bx;
int nby = point.by;
int nrx = point.rx;
int nry = point.ry;
// ํ๋ ์ด๋
boolean isFail = false; // ์คํจ ์ฌ๋ถ
boolean isRed = false; // ๋นจ๊ฐ์ ๋ง๋ฌ๋์ง
while (board[nbx][nby] != '#') { // ๋ฒฝ์ ๋ฟ๊ธฐ ์ ๊น์ง
nbx += dx[d];
nby += dy[d];
if (board[nbx][nby] == 'O') { // ๊ตฌ๋ฉ์ ๋น ์ง
isFail = true;
break;
} else if (nbx == nrx && nby == nry) { // ๋นจ๊ฐ ๋ง๋ฌ๋์ง ํ์ธ
isRed = true;
}
}
nbx -= dx[d];
nby -= dy[d];
//ํ๋์ด ๊ตฌ๋ฉ์ ๋น ์ก์ผ๋ฉด ์ผ๋จ ๋๊น(๋ค์ ํ์์์ ์ฐพ์ ์๋ ์๊ณ , ์ด์ฐจํผ ๋ค์์ ๋นจ๊ฐ ๋ชป์ฐพ์ผ๋ฉด ์ค๋จ๋จ)
if (isFail) {
continue;
}
if (isRed) { //๋นจ๊ฐ์ ๋ง๋์ ์ด ์์์ผ๋ฏ๋ก ํ์นธ ๋ค๋ก
nbx -= dx[d];
nby -= dy[d];
}
// ๋นจ๊ฐ ์ด๋
while (board[nrx][nry] != '#') { // ๋ฒฝ ๋ฟ๊ธฐ ์ ๊น์ง
nrx += dx[d];
nry += dy[d];
// ์ฑ๊ณต
if (board[nrx][nry] == 'O') { // ๋นจ๊ฐ ๊ตฌ์ฌ์ด ๋น ์ง
return count;
}
}
nrx -= dx[d];
nry -= dy[d];
if (nrx == nbx && nry == nby) { // ํ๋ ์์ผ๋ฉด ๋ค๋ก ๋ฏธ๋ฃธ
nrx -= dx[d];
nry -= dy[d];
}
if (!visited[nbx][nby][nrx][nry]) { // ๋ฐฉ๋ฌธํ์ ์์ผ๋ฉด ์ด๋
queue.add(new Point(nbx, nby, nrx, nry));
visited[nbx][nby][nrx][nry] = true;
}
}
}
}
return -1;
}
}
๊ฒฐ๊ณผ
๋ฐฐ์ด์
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 2206๋ฒ : ๋ฒฝ๋ถ์๊ณ ์ด๋ํ๊ธฐ (0) | 2023.08.30 |
---|---|
๋ฐฑ์ค 16724๋ฒ : ํผ๋ฆฌ ๋ถ๋ ์ฌ๋์ด (1) | 2023.08.29 |
๋ฐฑ์ค 13459๋ฒ : ๊ตฌ์ฌ ํ์ถ (0) | 2023.08.02 |
๋ฐฑ์ค 1863๋ฒ : ์ค์นด์ด๋ผ์ธ ์ฌ์ด๊ฑฐ (0) | 2023.07.26 |
๋ฐฑ์ค 23743๋ฒ : ๋ฐฉํ์ถ (0) | 2023.07.26 |