๋ฌธ์
ํ์ด
์ด ๋ฌธ์ ๋ ์์ ์ BFS๋ฅผ ํ์ฐฝ ํ์์ ๋์๋ ๋ชป ํ์๋ ๋ฌธ์ ์๋๋ฐ ์ด์ ์ ์ฌํ ๋ฌธ์ ์ธ 1600. ๋ง์ด ๋๊ณ ํ ์์ญ์ด๋ฌธ์ ๋ฅผ ํ๊ณ ์๊ฐ์ ์ป์ด์ ๋ค์ ๋์ ํ๋๋ ์ฝ๊ฒ ํ๋ ธ๋ค.
์ด ๋ฌธ์ ๊ฐ ์ผ๋ฐ์ ์ธ BFS๋ณด๋ค ๊น๋ค๋ก์ด ์ด์ ๋ ์ด๋ค ์ขํ์ ์ฌ ์ ์๋ ๊ฒฝ์ฐ์ ์๊ฐ 2๊ฐ์ง(์ด์ ์ ๋ฒฝ์ ๋ถ์ ๊ฒฝ์ฐ, ์ด์ ์ ๋ฒฝ์ ๋ถ์์ง ์์ ๊ฒฝ์ฐ)๋ผ๋ ์ ์ด๋ค. ๋ฐ๋ผ์ 2์ฐจ์ ๋ฐฉ๋ฌธ ๋ฐฐ์ด๋ก๋ ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ๊ณ 3์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค. 3์ฐจ์ ๋ฐฐ์ด์์ 0๋ฒ์จฐ ์ธ๋ฑ์ค๋ ๋ฒฝ์ ์ด๋ฏธ ๋ถ์๊ณ ์จ ๊ฒฝ์ฐ, 1๋ฒ์งธ ์ธ๋ฑ์ค๋ ๋ฒฝ์ ์์ง ๋ถ์์ง ์์ ๊ฒฝ์ฐ์ด๋ค.
bfs๋ฅผ ์งํํ๋ฉฐ ๋ค์์ 3๊ฐ์ง ๊ฒฝ์ฐ์ ๋ํด์ ์ฒ๋ฆฌํด์ฃผ์๋ค.
- ํ์ฌ ๋ฒฝ์ ๋ถ์ ์ ์๋ ๊ธฐํ๊ฐ ๋จ์์๊ณ ๋ค์ ๋ฐฉ๋ฌธํ ์ขํ๊ฐ ๋ฒฝ์ธ ๊ฒฝ์ฐ, ๊ธฐํ๋ฅผ ์์งํ๊ณ ๋ฒฝ์ ๋ฐฉ๋ฌธ
- ๊ธฐํ๊ฐ ๋จ์์์ง๋ง ๋ค์ ๋ฐฉ๋ฌธํ ์ขํ๊ฐ ๋ฒฝ์ด ์๋ ๊ฒฝ์ฐ์๋ ๊ธฐํ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ค์ ์ง์ ์ผ๋ก ๋ฐฉ๋ฌธ
- ๊ธฐํ๊ฐ ๋จ์์์ง ์๋ค๋ฉด ๋ค์ ๋ฐฉ๋ฌธํ ์ขํ๊ฐ ๋ฒฝ์ด ์๋ ๊ฒฝ์ฐ๋ง ๋ฐฉ๋ฌธ
๊ตฌํํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class Solution2206 {
static class Pair {
int x;
int y;
int dist;
int remain;
public Pair(int x, int y, int dist, int remain) {
this.x = x;
this.y = y;
this.dist = dist;
this.remain = remain;
}
}
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int N, M;
static int[] dx = {1, -1, 0, 0}, dy = {0, 0, 1, -1};
static int[][] map;
static boolean[][][] visited;
public static void main(String[] args) throws IOException {
String[] input = br.readLine().split(" ");
N = Integer.parseInt(input[0]);
M = Integer.parseInt(input[1]);
map = new int[N][M];
visited = new boolean[N][M][2];
for (int i = 0; i < N; i++) {
String line = br.readLine();
for (int j = 0; j < M; j++) {
map[i][j] = Character.getNumericValue(line.charAt(j));
}
}
System.out.println(bfs());
}
private static int bfs() {
Queue<Pair> q = new LinkedList<>();
q.add(new Pair(0, 0, 1, 1));
while (!q.isEmpty()) {
Pair cur = q.poll();
if (cur.x == N - 1 && cur.y == M - 1) return cur.dist;
if (cur.remain == 1) {
for (int i = 0; i < 4; i++) {
int nX = cur.x + dx[i];
int nY = cur.y + dy[i];
if (nX < 0 || nY < 0 || nX >= N || nY >= M) continue;
if (map[nX][nY] == 1 && !visited[nX][nY][0]) {
visited[nX][nY][0] = true;
q.add(new Pair(nX, nY, cur.dist + 1, 0));
} else if (map[nX][nY] == 0 && !visited[nX][nY][1]) {
visited[nX][nY][1] = true;
q.add(new Pair(nX, nY, cur.dist + 1, 1));
}
}
}
for (int i = 0; i < 4; i++) {
int nX = cur.x + dx[i];
int nY = cur.y + dy[i];
if (nX < 0 || nY < 0 || nX >= N || nY >= M || visited[nX][nY][cur.remain] || map[nX][nY] == 1) continue;
visited[nX][nY][cur.remain] = true;
q.add(new Pair(nX, nY, cur.dist + 1, cur.remain));
}
}
return -1;
}
}
'๐ Algorithm > ๐ป ๋ฌธ์ ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1520. ๋ด๋ฆฌ๋ง๊ธธ (0) | 2021.04.01 |
---|---|
[๋ฐฑ์ค] 2629. ์ํ ์ ์ธ (0) | 2021.04.01 |
[๋ฐฑ์ค] - 1277. ๋ฐ์ ์ ์ค์น (0) | 2021.03.24 |
[๋ฐฑ์ค] 1799. ๋น์ (0) | 2021.03.07 |
[๋ฐฑ์ค] 1967. ํธ๋ฆฌ์ ์ง๋ฆ (0) | 2021.03.06 |
๋๊ธ