๋ฌธ์
ํด๋น ํฌ์คํ ์ ๋ฐฑ์ค์ 2178๋ฒ ๋ฏธ๋ก ํ์ ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๊ธ ์ ๋๋ค.
์ ๋ต ์์ค ์ฝ๋๋ฅผ ํ์ธํ์๋ ค๋ฉด solve url ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋์ง๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
๋ฌธ์ ์ ๊ทผ
๋ฌธ์ ๋ฅผ ์ฝ์ผ๋ฉฐ ๋ฐ๋ก ํ์ ํด์ผ ํ๋ ๊ฒ์ ์ต์์๋ผ๋ ํค์๋์ด๋ค.
ํด๋น ๋ฌธ์ ๋ Dfs์ Bfs ๋ชจ๋ ํ ์ ์๋ ๋ฌธ์ ์ด๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๋ BFS๋ฅผ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด์ ๋ค์๊ณผ ๊ฐ์ ๊ด๊ณ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ฌ๊ธฐ์ DFS๋ฅผ ์ด์ฉํ๋๋ฐ, ์ด์ด ๋์๊ฒ DFS์์ ์ฒ์์ผ๋ก ์ ํํ ๋ ธ๋๊ฐ 6์ด๋ผ๊ณ ํด๋ณด์.
๊ทธ๋ผ ์ค์ ๋ก ์ฐพ๋ ๋ ธ๋๋ ๋ฐ๋ก ํ์นธ ์์ ์์ง๋ง, DFS๋ฅผ ์ฌ์ฉํ๋ค๋ฉด 6์ ๋ ๊น์ง ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๊ทธ๋์ ์ด๋ฐ ์ต๋จ ๊ฑฐ๋ฆฌ, ๊ฒฝ๋ก๋ฌธ์ ๋ BFS๋ฅผ ์ด์ฉํด์ ํ์ด์ผ ํ๋ค.
ํด๊ฒฐ๋ฒ
์ด๋ฒ ๋ฌธ์ ์ ํต์ฌ์ ๋ฐ๋ก ์นธ์ ์๋ฅผ ์ง์ ํ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ๋ค์๊ณผ ๊ฐ์ ๋ฏธ๋ก๊ฐ ์๋ค๊ณ ํด๋ณด์.
1 0 0 0 0
1 0 0 0 0
1 0 0 0 0
1 0 0 0 0
๊ทธ๋ผ ์ผ์ชฝ ์ ์ผ ์๋๋ก ๊ฐ๋ ค๋ฉด ๋ช ์นธ์ ์ด๋ํด์ผ ํ ๊น?
๊ทธ๋ ๋ค 4์นธ์ด๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ์ฝ๋ฉ์ ํด์ผ 4์นธ์ด ๋์ฌ์ง ์๊ฐํด๋ณด์.
BFS์์ ํ์ ์ขํ๋ฅผ ๋ฃ์ ๋?
BFS์์ ํ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋บ ๋?
ํ์ํ ๋, ๋ค์์ ๋ฐ์ ์นธ์ ํ์ฌ ์นธ๊น์ง์ ๊ฐ์ค์น๋ฅผ ๋ํด์ฃผ๋ฉด ๋๋ค.
์ฝ๊ฐ์ DP ์ค๋ฌ์ด ๋ ผ๋ฆฌ๋ผ๊ณ ์๊ฐํ๋ฉด ์กฐ๊ธ ์ฌ์ธ ๊ฒ ๊ฐ๋ค.
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0
์๋ง ์ด๋ ๊ฒ ๋์ง ์์๊น?
์ค์ ๋ก ์ฝ๋ ์์์๋ ์๋ง ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฒ์ด๋ค.
graph[๋ค์ ์นธ.y][๋ค์ ์นธ.x] = graph[์ด์ ์นธ.y][์ด์ ์นธ.x] + 1;
์ด๋ ๊ฒ ํ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ์์๋ก ๋ฐ์๋ ๋ฐฐ์ด์ ์๋ง ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฒ์ด๋ค.
4 6 (๋ณํ ์ ) 4 6 (๋ณํ ํ)
1 0 1 1 1 1 1 0 9 10 11 12
1 0 1 0 1 0 2 0 8 0 12 0
1 0 1 0 1 1 3 0 7 0 13 14
1 1 1 0 1 1 4 5 6 0 14 15
๋ํ visited[][]
๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฐ์ด์ ํตํด์ ์ค๋ณต๋ ๋ฐฉ๋ฌธ์ ํ์ง ์๋๋ก ํด์ฃผ์.
์ ๋ต ์ฝ๋
import java.io.*;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
static int n, m;
static int[][] graph;
static boolean[][] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] nm = br.readLine().split(" ");
n = Integer.parseInt(nm[0]);
m = Integer.parseInt(nm[1]);
graph = new int[n + 1][m + 1];
visited = new boolean[n + 1][m + 1];
for (int i = 1; i <= n; i++) {
String[] line = br.readLine().split("");
for (int j = 1; j <= m; j++) {
graph[i][j] = Integer.parseInt(line[j-1]);
}
}
int[] dx = {1, 0, -1, 0};
int[] dy = {0, 1, 0, -1};
Queue<MazePoint> queue = new LinkedList<>();
queue.add(new MazePoint(1, 1));
visited[1][1] = true;
while(!queue.isEmpty()) {
MazePoint point = queue.remove();
for (int i = 0; i < dx.length; i++) {
int xx = point.x + dx[i];
int yy = point.y + dy[i];
if(xx > 0 && yy > 0 && xx <= m && yy <= n) {
if(graph[yy][xx] != 0 && !visited[yy][xx]) {
visited[yy][xx] = true;
graph[yy][xx] = graph[point.y][point.x] + 1;
queue.add(new MazePoint(xx, yy));
}
}
}
}
bw.write(String.valueOf(graph[n][m]));
bw.flush();
bw.close();
}
}
class MazePoint {
int x;
int y;
MazePoint(int x, int y) {
this.x = x;
this.y = y;
}
}
๋ฌธ์ ํ๊ณ
์ด๋ฒ ๋ฌธ์ ๋ ๋ฐ๋ก ์ ๋ฌธ์ ์ธ ํ ๋งํ ์์ ๋๋ฌด ์ง์ ๋นผ์์ธ์ง ์ ์ ํ๋ ธ๋ ๋ฌธ์ ์ด๋ค.
ํ์ง๋ง ๋ฌธ์ ๋ฅผ ํ๋ฉด์ StackOverFlow ์๋ฌ๋ฅผ ํ ๋ฒ ๋ง์ฃผํ๊ณ , ํ๋ฅผ ์ด์ฉํ ๋ ๊ผผ๊ผผํ enqueue ์กฐ๊ฑด์ ํ์ธํ์ง ์๋ ๋ถ๋ถ์ด ๋ ๋๋ฅผ ์ก์๋ค.
๋จธ๋ฆฌ์์ ์ผ๋ํด๋๊ณ ํ๊ณ ์์ผ๋ฉด์๋ ๋นจ๋ฆฌ ์คํ์์ผ๋ณด๋ ค๋ ๊ทธ ์๊ฐ ๋๋ฌธ์ ๋ ์ค์ํ๋ ๊ฒ ๊ฐ๋ค.
๋ํ ์ด๋ฐ x, y ์ขํ ๋ฌธ์ ์์ x, y๋ฅผ ๋ฐฐ์ด๋ก ์ฎ๊ธด๋ค๋ฉดarr[x][y]
๊ฐ ์๋๋ผarr[y][x]
์ธ ๊ฒ์ ๋ ๊น๋จน์๋ค.
์์ผ๋ก๋ ์ด๋ฐ ์ค์๋ฅผ ํ์ง ์๊ฒ ๋ ๋๋๋๋๋๋๋๋๋๋ ์ผ๋ํด์ผ๊ฒ ๋ค.
๋๊ธ