๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/17244
โธ ๋ฌธ์
๊ฒฝ์ฌ์จ๋ ์ ๋ ์ฝ์์ ๊ฐ๊ธฐ ์ ์ฑ๊ธฐ์ง ์์ ๋ฌผ๊ฑด๋ค์ด ์๋ ์ง ํ์ธํ๊ณ ์๋ค. ํ์ํ ๋ฌผ๊ฑด์ ์ ๋ถ ์ฑ๊ธด ๊ฒ ๊ฐ์๊ณ ์ธ์ถ ํ ๋์์ค๋ ๊ธธ์ ๊ฒฝ์ฌ์จ๋ ์ธ์ณค๋ค.
"์ ๋ง๋ค ์ฐ์ฐ!!!"
๊ฒฝ์ฌ ์จ๋ ๋งค๋ฒ ์ธ์ถํ๊ณ ๋์์ผ ์ด๋ค ๋ฌผ๊ฑด์ ์ง์ ๋๊ณ ์๋ค๋ ๊ฒ์ ๋ ์ฌ๋ฆด ๋๋ง๋ค ์์ฑ ๊ฐ์ ์๋ฌ๋ฆฌ๋ ๊ฒ์ด ๋๋ฌด ์ซ์๋ค.
์ธ์ถ์ด ์ฆ์ ๊ฒฝ์ฌ ์จ๋ ๋ฐ๋ณต๋๋ ์ผ์ ๊ทผ์ ํ๊ธฐ ์ํด ๊ผญ ์ฑ๊ฒจ์ผ ํ ๋ฌผ๊ฑด๋ค์ ์ ๋ฆฌํด๋ณด์๋ค. ํ์ง๋ง ์ง๊ฐ, ์ค๋งํธํฐ, ์ฐ์ฐ, ์ฐจ ํค, ์ด์ดํฐ, ์๊ณ, ๋ณด์กฐ ๋ฐฐํฐ๋ฆฌ ๋ฑ ์ข ๋ฅ์ ๊ฐ์๊ฐ ๋๋ฌด ๋ง์๋ค.
ํ์ ๋ถํ์ํ ์์ง์์ ์์ฃผ ์ซ์ดํ๋ ๊ฒฝ์ฌ ์จ๋ ์ด ๋ฌผ๊ฑด๋ค์ ์ต๋ํ ๋น ๋ฅด๊ฒ ์ฑ๊ฒจ์ ์ธ์ถํ๋ ์ด๋ ๊ฒฝ๋ก๋ฅผ ์๊ณ ์ถ์๋ค.
๊ฒฝ์ฌ ์จ๋ ํ ๊ฑธ์์ ์ํ์ข์ฐ์ ์ธ์ ํ ์นธ์ผ๋ก๋ง ์์ง์ผ ์ ์๋ค.
๊ฒฝ์ฌ ์จ๋ฅผ ์ํด ์ง์ ์์์ ๋ฐ๋ผ๋ณธ ๋ชจ์ต๊ณผ ์ฑ๊ฒจ์ผ ํ ๋ฌผ๊ฑด๋ค์ ์์น๋ค์ ์๊ณ ์์ ๋, ๋ฌผ๊ฑด์ ๋ชจ๋ ์ฑ๊ฒจ์ ์ธ์ถํ๊ธฐ๊น์ง ์ต์ ๋ช ๊ฑธ์์ด ํ์ํ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์.
โธ ์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์ง์ ๊ฐ๋ก ๊ธธ์ด N๊ณผ ์ธ๋ก ๊ธธ์ด M์ด ์ ๋ ฅ๋๋ค. (3 ≤ N, M ≤ 50)
๋ ๋ฒ์งธ ์ค๋ถํฐ๋ ์ง์ ๊ตฌ์กฐ๊ฐ ์์ ์ ๋ ฅ๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค.
๋น์ด์๋ ๊ณณ์ '.'๋ก ๋ฒฝ์ '#'๋ก ์ ๋ ฅ๋๋ค. ๊ฒฝ์ฌ ์จ์ ํ์ฌ ์์น๋ S, ๋๊ฐ๋ ๋ฌธ์ ์์น๋ E, ์ฑ๊ฒจ์ผ ํ๋ ๋ฌผ๊ฑด์ ์ข ๋ฅ์ ์๊ด์์ด X๋ก ์ ๋ ฅ๋๋ค.
์ฑ๊ฒจ์ผ ํ๋ ๋ฌผ๊ฑด์ ์ต๋ 5๊ฐ๊น์ง ์์ ์ ์๋ค. ์ง์ ์ธ์ ๋ ๋ฒฝ์ผ๋ก ๋๋ฌ์ธ์ฌ ์๊ณ , ๋๊ฐ๋ ๋ฌธ์ ์ธ์ ๋ ํ๋์ด๋ค.
โธ ์ถ๋ ฅ
S์์ ์ถ๋ฐํ์ฌ ๋ชจ๋ ๋ฌผ๊ฑด์ ์ฑ๊ฒจ์ E๊น์ง ๋์ฐฉํ ์ ์๋ ์ต์ ์๊ฐ์ ์ถ๋ ฅํ๋ค. ๋ชจ๋ ๋ฌผ๊ฑด์ ์ฑ๊ธธ ์ ์๋ ๊ฒฝ์ฐ๋ ์ฃผ์ด์ง์ง ์๋๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 2
- ๐ ๋ฌธ์ ์ ํ : ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๋๋น ์ฐ์ ํ์, ๋นํธ๋ง์คํน
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
์์ดํ ์ ์ต๋ 5๊ฐ๊น์ง ์์ ์ ์์ผ๋ฏ๋ก, 2โต = 32๊ฐ์ง ์กฐํฉ์ intํ์ผ๋ก ์ถฉ๋ถํ ํํํ ์ ์๋ค.
๋ฐ๋ผ์ ๊ฒฝ์ฌ ์จ๊ฐ ์ด๋ค ์์ดํ ์ ์ฑ๊ฒผ๋์ง๋ฅผ ๋นํธ๋ง์คํฌ๋ก ํํํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ฉด์, 'X'๋ก ํ์๋ ์์ดํ ๋ง๋ค 0๋ถํฐ ์์ฐจ์ ์ผ๋ก ๋ฒํธ๋ฅผ ๋ถ์ฌํ๋ค.
์์ ์ ๋ ฅ1์ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ์๋์ ๊ฐ๋ค.
์ด ๋ฒํธ๋ค์ ๋นํธ๋ง์คํฌ์ ๊ฐ ์๋ฆฟ์๋ก ์ฌ์ฉ๋๋ฉฐ, ์ผ์ชฝ ์ํํธ ์ฐ์ฐ (1 << n)์ ํตํด ๋นํธ์์์ ํด๋น ์์ดํ ์ ํํํ ์ ์๋ค.
์์ดํ
์ ํ๋๋ ์ฑ๊ธฐ์ง ์์ ์ํ๋ถํฐ ๋ชจ๋ ์์ดํ
์ ์ฑ๊ธด ์ํ๊น์ง์ ๋ชจ๋ ์กฐํฉ์ ๊ณ ๋ คํด์ผ ํ๋ค.
์ด๋, ๋ชจ๋ ์์ดํ
์ ๋ค ์ฑ๊ธด ์ํ๋ ์ ์ฒด ์งํฉ(๊ณต์งํฉ ์ ์ธ)์ ์๋ฏธํ๋ฏ๋ก int checkNum = (1 << itemCnt) - 1๋ก ์ค์ ํ๋ค.
์ด ๊ฐ์ ํ์ ์ค ๋ชจ๋ ์์ดํ ์ ์์งํ๋์ง ํ๋จํ๋ ๊ธฐ์ค์ด ๋๋ค.
ํ์ ์ค ์์ดํ ์ ๋ฐ๊ฒฌํ ๊ฒฝ์ฐ, ํ์ฌ ์์ดํ ์ํ์ OR ๋นํธ ์ฐ์ฐ |์ ์ฌ์ฉํด ์๋ก์ด ์์ดํ ์ ๋์ ํ๋ค.
๊ฒฝ์ฌ ์จ๊ฐ 0๋ฒ ์์ดํ ์ ์์ ํ๊ณ ์๊ณ , 2๋ฒ ์์ดํ ์ ๋ฐ๊ฒฌํ์ ๋๋ฅผ ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
๊ฒฝ์ฌ ์จ๊ฐ ๋ชจ๋ ์์ดํ ์ ์ฑ๊ธฐ๊ณ ์ต์ ์๊ฐ ๋ด์ ์ธ์ถํด์ผ ํ๋ฏ๋ก, ๋๋น ์ฐ์ ํ์(BFS)์ ์ฌ์ฉํ๋ค.
์ด๋ ๊ฐ์ ์์น๋ผ๋ ํ์ฌ๊น์ง ์ฑ๊ธด ์์ดํ ์ ์กฐํฉ์ด ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์, ๋จ์ํ ์์น๋ง์ ๊ธฐ์ค์ผ๋ก ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๊ฒฝ์ฌ ์จ๊ฐ 1๋ฒ ์์ดํ ์ ์ฑ๊ธด ๋ค ๋ค์ ์๋ ์๋ ๊ธธ์ ๋๋์๊ฐ์ผ ํ๋ ์ํฉ์ด ์๋ค๊ณ ํ์.
๋ง์ฝ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ฉด, ์ด๋ฏธ ํ ๋ฒ ๊ฐ๋ ๊ธธ์ ๋ค์ ๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํ๊ฒ ๋๋ค.
๊ทธ๋์ ์์น๋ฟ ์๋๋ผ ์์ดํ ์ํ๋ ํจ๊ป ๊ณ ๋ คํ 3์ฐจ์ ๋ฐฉ๋ฌธ ๋ฐฐ์ด checked = new boolean[m][n][checkNum+1]์ด ํ์ํ๋ค.
์ฌ๊ธฐ์ checkNum + 1๋ก ์ค์ ํ ์ด์ ๋, checkNum์ ๊ฐ๋ฅํ ์์ดํ ์ํ ์ค ๊ฐ์ฅ ๋ง์ง๋ง ๊ฐ์ ์๋ฏธํ๊ณ , 0๋ถํฐ checkNum๊น์ง์ ๋ชจ๋ ์ํ๋ฅผ ์ ์ฅํ๋ ค๋ฉด ์ด checkNum + 1๊ฐ์ ๊ณต๊ฐ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๋ฐฐ์ด์ ๊ฒฝ์ฌ ์จ๊ฐ (x, y) ์์น์ ์ด๋ค ์์ดํ ์ํ๋ก ๋๋ฌํ๋์ง๋ฅผ ๊ธฐ๋กํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
BFS ํ์ ์ค ์ถ๊ตฌ 'E'์ ๋๋ฌํ์ ๋, ํ์ฌ ์์ดํ ์ํ๊ฐ checkNum๊ณผ ๊ฐ๋ค๋ฉด ๋ชจ๋ ๋ฌผ๊ฑด์ ์ฑ๊ธด ์ํ๋ก ์ธ์ถ์ ์ฑ๊ณตํ ๊ฒ์ด๋ฏ๋ก, ๊ทธ๋๊น์ง ๊ฑธ๋ฆฐ ์๊ฐ์ ๋ฐํํ์ฌ ์ถ๋ ฅํ๋ค.
์ ํ์ด์ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ์ ์ฒด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 15792KB
์๊ฐ : 96ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int n, m, itemCnt;
static int[][] map;
static boolean[][][] checked; // ์์น, ์ฑ๊ธด ๋ฌผ๊ฑด
static Pos start;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static public class Pos {
int x; int y; int cnt; int time;
public Pos (int x, int y, int cnt, int time) {
this.x = x; this.y = y;
this.cnt = cnt; this.time = time;
}
}
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()); // ์ธ๋ก
map = new int[m][n];
for (int i = 0; i < m; i++) {
String str = br.readLine();
for (int j = 0; j < n; j++) {
map[i][j] = str.charAt(j);
// S : ๊ฒฝ์ฌ ์จ์ ํ์ฌ ์์น
// X : ์ฑ๊ฒจ์ผ ํ๋ ๋ฌผ๊ฑด
if (map[i][j] == 'S') {
start = new Pos(i, j, 0, 0);
map[i][j] = '.';
} else if (map[i][j] == 'X') map[i][j] = itemCnt++;
}
}
System.out.println(bfs());
br.close();
}
private static int bfs() {
Queue<Pos> que = new LinkedList<>();
que.offer(start);
int checkNum = (1 << itemCnt) - 1;
checked = new boolean[m][n][checkNum+1];
while (!que.isEmpty()) {
Pos now = que.poll();
// ๋๊ฐ๋ ๋ฌธ
if (map[now.x][now.y] == 'E') {
// ๋ชจ๋ ์์ดํ
ํ๋
if (checkNum == now.cnt) return now.time;
}
for (int d = 0; d < 4; d++) {
int nx = now.x + dx[d];
int ny = now.y + dy[d];
if (rangeCheck(nx, ny)) continue; // ๋ฒ์ ์ฒดํฌ
if (checked[nx][ny][now.cnt] || map[nx][ny] == '#') continue; // ์ด๋ฏธ ์ฑ๊ธด ๋ฌผ๊ฑด, ๋ฒฝ -> ์ด๋ X
// ๋ค์ ์ฑ๊ธธ ๋ฌผ๊ฑด
int nextItem = now.cnt;
if (map[nx][ny] <= itemCnt) nextItem |= 1 << map[nx][ny];
checked[nx][ny][nextItem] = true;
que.offer(new Pos(nx, ny, nextItem, now.time+1));
}
}
return -1;
}
private static boolean rangeCheck(int x, int y) {
return x < 0 || x >= m || y < 0 || y >= n;
}
}
์์ ์ ๋นํธ ๋ง์คํน์ ํ์ฉํด ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํ๋ ๋น์ทํ ๋ฌธ์ ๋ฅผ ํ์๋ ๊ธฐ์ต ๋๋ถ์ ๋น๊ต์ ์ฝ๊ฒ ๋ฌธ์ ๋ฅผ ํ ์ ์์๋ค.
๋นํธ ๋ง์คํน์ ํ์ฉํด ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํ๋ ์ ํ์ด ์๊ทผ ๋ง์ด ๋ณด์ด๋ ๊ฒ ๊ฐ๋ค.
๋ฐฑ์ค์ ์ฑ๊ณฝ, ๋ก๋ด ์ฒญ์๊ธฐ๋ ๋น์ทํ ๋ฌธ์ ๋๊น ๋ค์ ํ๋ฒ ํ๊ณ ์ ๋ฆฌํด์ผ๊ฒ ๋ค ! ๐๐ป๐
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_1194] ์์ด์คํฌ๋ฆผ ๋๋ ์งํธ (3) | 2025.08.05 |
---|---|
[Boj_1194] ๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค, ๊ฐ์. (0) | 2025.07.25 |
[Boj_15787] ๊ธฐ์ฐจ๊ฐ ์ด๋ ์ ํค์น๊ณ ์ํ์๋ฅผ (1) | 2025.07.03 |
[Boj_20058] ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด์คํฐ (0) | 2025.06.15 |
[Boj_1263] ์๊ฐ ๊ด๋ฆฌ (0) | 2025.05.11 |