https://www.acmicpc.net/problem/1261
๋ฌธ์
์์ฝ
- ํ์ฌ (1, 1)์ ์๋ ์๊ณ ์คํ ์ด์์ง์ด (N, M)์ผ๋ก ์ด๋ํ๋ ค๋ฉด ๋ฒฝ์ ์ต์ ๋ช ๊ฐ ๋ถ์์ด์ผ ํ๋์ง ๊ตฌํ๊ธฐ
- ์ด๋ค ๋ฐฉ์์ ์ด๋ํ ์ ์๋ ๋ฐฉ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๋น ๋ฐฉ์ด๋ค.
- ๋ฒฝ์ ๋ถ์๋ฉด, ๋น ๋ฐฉ๊ณผ ๋์ผํ ๋ฐฉ์ผ๋ก ๋ณํ๋ค.
์ ํ์ฌํญ
- ์ฒซ์งธ ์ค์ ๋ฏธ๋ก์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๊ฐ๋ก ํฌ๊ธฐ M, ์ธ๋ก ํฌ๊ธฐ N (1 ≤ N, M ≤ 100)์ด ์ฃผ์ด์ง๋ค.
- N๊ฐ์ ์ค์๋ ๋ฏธ๋ก์ ์ํ๋ฅผ ๋ํ๋ด๋ ์ซ์ 0๊ณผ 1์ด ์ฃผ์ด์ง๋ค. 0์ ๋น ๋ฐฉ์ ์๋ฏธํ๊ณ , 1์ ๋ฒฝ์ ์๋ฏธํ๋ค.
- (1, 1)๊ณผ (N, M)์ ํญ์ ๋ซ๋ ค์๋ค.
ํ์ด
์ํ์ข์ฐ ์ธ์ ํ ์นธ์ผ๋ก ํ ์นธ์ฉ ์ด๋ํ์ ๋์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ก, ํ ์นธ์ฉ ์ด๋ํ๋ฉฐ ์ฌ๋ฐฉํ์์ ํตํด ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด ์ดํผ๊ณ ๋ชฉํ ์ง์ ์ ๋๋ฌํ์์ ํ์์ ์ข ๋ฃํด์ผ ํ๋ค. ๋ฐ๋ผ์ BFS ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์๋ค.
์ฒซ๋ฒ์งธ ํ์ด ํ, ์๋ชป ํ์๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ณ ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ํ์ด๋ฅผ ๊ณต๋ถํ๊ณ ํ์ด๋ณด์๋ค. BFS ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ๊ฒ์ ๊ฐ์ง๋ง, ๊ตฌํ ๋ฐฉ๋ฒ์ด ์ด์ง ๋ค๋ฅด๋ค.
1. BFS + 3์ฐจ์ ๋ฐฉ๋ฌธ ์ฒดํฌ : (515ms ํ์ด)
2. BFS + ์ฐ์ ์์ ํ : (156ms ํ์ด)
3. BFS + ๋ฑ (0-1 BFS) : (136ms ํ์ด)
1. BFS + 3์ฐจ์ ๋ฐฉ๋ฌธ ์ฒดํฌ
๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ 2(https://www.acmicpc.net/problem/14442)์ ์ ์ฌํ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ค. ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ๋ ๋ฒฝ์ K๊ฐ ๊น์ง ๋ถ์๊ณ ์ด๋ํ๋ ๊ฒฝ์ฐ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ์๊ณ ์คํ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ ์๋์ง๋ง ๋ฒฝ์ ์ต์ ๋ช ๊ฐ ๋ถ์์ด์ผ ํ๋์ง ๊ตฌํ๋ ๋ฌธ์ ๋ก ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ค.
*์ฐธ๊ณ : ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ 2 ํ์ด (https://programmingiraffe.tistory.com/146)
(๊ฐ์ ์ ์ด ์๋ ํ์ด์ด๋ค)
1. ๋ฒฝ์ ์ง๊ธ๊น์ง ๋ช ๊ฐ ๋ถ์๋์ง ์ ๋ณด ์ ์ฅ
ํ์ ์ขํ ์ ๋ณด๋ฅผ ๋ฃ์ ๋, ํ๋ ฌ ์ขํ๊ฐ, ์ง๊ธ๊น์ง ๋ช ๊ฐ์ ๋ฒฝ์ ๋ถ์์ ์ด ์๋์ง ์ ๋ณด๋ฅผ ์ ์ฅํ ํ์๊ฐ ์๋ค. ๋ฐ๋ผ์ ์ขํ ์ ๋ณด๋ฅผ ๋ด๋ Point๋ผ๋ ๊ฐ์ฒด์ int ํ์ ๋ณ์(hit)์ ์ถ๊ฐํด์คฌ๋ค.
2. ๋ฐฉ๋ฌธ์ฒดํฌ : boolean[N][M][K]
๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ ๋, ํด๋น ์ง์ ์ ๋ํด ์ง๊ธ๊น์ง ๋ฒฝ์ ๋ช ๋ฒ ๋ถ์๊ณ ๋ฐฉ๋ฌธํ๋๊ฐ ์ํ๋๊ฐ๋ฅผ ํ์ํ๋ค. ํด๋น ์ง์ ์ ํ๋ฒ๋ ์๋ถ์๊ณ ๋ฐฉ๋ฌธํ ์๋ ์๊ณ , 1๋ฒ ๋ถ์๊ณ ๋ฐฉ๋ฌธํ ์๋ ์๊ณ , .. K๋ฒ ๋ถ์๊ณ ๋ฐฉ๋ฌธํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋จผ์ 3๋ฒ ๋ถ์๊ณ ๋ฐฉ๋ฌธํ์ด๋ ํ์ 1๋ฒ ๋ถ์๊ณ ๋ฐฉ๋ฌธํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ๋ค๋ฅด๊ฒ ํด์ค์ผ ํ๋ค.
3. ๋ฒฝ์ธ์ง ๋ฒฝ์ด ์๋์ง์ ๋ฐ๋ผ ํ์์ ๋ค๋ฅด๊ฒ ํ๊ธฐ
- ๋ฒฝ์ด ์๋๋ค
- ์ง๊ธ๊น์ง n๊ฐ ๋ถ์ด ๋ฐฉ๋ฌธํ์ ์ด ์์ => n๊ฐ ๊ทธ๋๋ก ํ์
- ๋ฒฝ์ด๋ค
- ์ง๊ธ๊น์ง n +1๊ฐ ๋ถ์ด ๋ฐฉ๋ฌธํ์ ์ด ์์ => n+1 ๋ถ์๊ณ ํ์
4. ๋์ฐฉํ๋ฉด ์ต์๊ฐ ๊ฐฑ์
์ต์๊ฐ๊ณผ Point์ hit ๊ฐ๊ณผ ๋น๊ตํ์ฌ ์ต์๊ฐ์ ๊ฐฑ์ ํด์ค๋ค.
5. ๊ฒฝ์ฐ์ ์ ๊ฐ์ง์น๊ธฐ
์ด๋๋ก ํ์์ ํ๊ฒ ๋๋ฉด ๊ฒฝ์ฐ์ ์๊ฐ ์ด๋ง์ด๋งํด์ง๋ค. ๋ฌดํ ๋ฃจํ์ ๋น ์ง๊ฒ ๋๊ณ ์๊ฐ ์ด๊ณผ๊ฐ ๋ ๊ฒ์ด๋ค. ์์ง ๋์ฐฉํ์ง๋ ์์๋๋ฐ, ํ์์ ๋์จ ์ด๋ค ์ขํ์์์ ์ง๊ธ๊น์ง ๋ถ์ ๋ฒฝ ์๊ฐ ๋ฌธ์ ์์์ ์ ๋ต์ธ ์ต์๊ฐ๋ณด๋ค ํฐ ๊ฒฝ์ฐ๋ค๋ ์์ ๊ฒ์ด๋ค. ์ด๋ฏธ ์ต์๊ฐ์ ๋์ด์ ๋ค๋ฉด ๋์ด์ ํ์ํ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ด ๊ฒฝ์ฐ์ ์๋ฅผ ๊ฐ์ง์น๊ธฐ๋ฅผ ํด์ค์ผ ํ๋ค. hit์ด min ๋ณด๋ค ํฐ ๊ฒฝ์ฐ์๋ ํ์์ ๋์ด์ ํ์ง ์๋๋ค.
1๋ฒ ํ์ด ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static char[][] graph;
static boolean[][][] visited;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static class Point {
int x, y, hit;
Point(int x, int y, int hit) {
this.x = x;
this.y = y;
this.hit = hit;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken()); //๊ฐ๋ก ํฌ๊ธฐ
N = Integer.parseInt(st.nextToken()); //์ธ๋ก ํฌ๊ธฐ
graph = new char[N][M];
for(int i = 0; i < N; i++) {
String line = br.readLine();
for(int j = 0; j < M; j++) {
graph[i][j] = line.charAt(j);
}
}
visited = new boolean[N][M][10001];
System.out.println(bfs(0, 0));
}
public static int bfs(int i, int j) {
Queue<Point> queue = new LinkedList<>();
queue.add(new Point(i, j, 0));
visited[i][j][0] = true;
int min = Integer.MAX_VALUE;
while(!queue.isEmpty()) {
Point point = queue.poll();
if(point.x == N - 1 && point.y == M - 1) {
min = Math.min(min, point.hit);
}
for(int d = 0; d < 4; d++) {
int nx = point.x + dx[d];
int ny = point.y + dy[d];
if(0 > nx || nx >= N || 0 > ny || ny >= M) continue; //๋ฏธ๋ก ๋ฐ
if(graph[nx][ny] == '0' && !visited[nx][ny][point.hit] && point.hit <= min) { //๋น ๋ฐฉ
queue.add(new Point(nx, ny, point.hit));
visited[nx][ny][point.hit] = true;
} else if(graph[nx][ny] == '1' && !visited[nx][ny][point.hit + 1] && point.hit + 1 <= min) { //๋ฒฝ
queue.add(new Point(nx, ny, point.hit + 1));
visited[nx][ny][point.hit + 1] = true;
}
}
}
return min;
}
}
1๋ฒ ํ์ด ๊ฒฐ๊ณผ
ํต๊ณผ๋ ํ๋๋ฐ ์๊ฐ์ด 500ms๋๊ฐ ๋์๋ค. ์ฑ์ ํํฉ์์ ๋ค๋ฅธ Java11์ ์๊ฐ์ ๋ณด๋ 100ms๋์๋ค..
์๊ฐ์ด ๋ง์ด ๋์จ ๊ฒ์ ๋ณด๋ ๊ฐ์ง์น๊ธฐ๊ฐ ๋ ๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ ์ฝ์์ ํ๋ฆฐํธ๋ก ํ์ํ๋ ๊ณผ์ ์ ์ฐ์ด๋ณด์๋ค.
์์ ์ ๋ ฅ 1๋ก ํ์ ๊ฒฝ์ฐ, ์ต์๊ฐ์ด 3์ธ๋ฐ hit์ด 5์ธ ๊ฒฝ์ฐ๊น์ง ๋ค ํ์ํ๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ์ ์ด ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ 3์ฐจ์์ผ๋ก ํ๋ฉด์ ์ฌ๋ฐฉํ์์ ํ๋ค๋ณด๋, ๋ฒฝ์ ๋ถ์๊ณ ์๋ก์ด hit๋ฅผ ๊ฐ์ง๊ณ ๋ค์ ์ด์ ์ขํ๋ก ๋์์ค๊ฒ ๋๋ค.
์์ ์ฝ๋์์ ๊ฐ์ ํ ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. hit์ด ์ต์์ธ point๋ถํฐ ํ์ํ๊ฒ ํ์ฌ, ํ์ ์์๊ฐ ๋จ์์๋๋ผ๋ BFS ํจ์๋ฅผ ์ข ๋ฃ์ํค๋๋ก ํด์ผ ํ๋ค.
2. ๋ฒฝ์ ๋ถ์๊ณ ์๋ก์ด hit๋ฅผ ๊ฐ์ง๊ณ ๋ค์ ์ด์ ์ขํ๋ก ๋์์ค์ง ์๋๋ก ํด์ผ ํ๋ค.
2. BFS + ์ฐ์ ์์ ํ
1๋ฒ ํ์ด์ ๋ฌธ์ ์ ์์ ๋ดค๋ฏ์ด, hit์ด ์ต์์ธ point๋ถํฐ ํ์ํ๊ฒ ํ์ฌ, ํ์ ์์๊ฐ ๋จ์์๋๋ผ๋ BFS ํจ์๋ฅผ ์ข ๋ฃ์ํค๋๋ก ํด์ผ ํ๋ค. ํ๋ฅผ ๋๋ฆฌ๋ ๊ณผ์ ์์ hit์ด ์ต์์ธ ์์๋ถํฐ ํ์ํ๊ธฐ ์ํด์๋ ํ๋ฅผ ์ฐ์ ์์ํ๋ก ๋ฐ๊ฟ์ผ ํ๋ค.
- ์ฐ์ ์์ํ ์ฌ์ฉ
Queue<Point> queue = new PriorityQueue<>((o1, o2) -> o1.hit - o2.hit);
Point ๊ฐ์ฒด์ copareTo ์ค๋ฒ๋ผ์ด๋ฉํ๋ ์ฝ๋๋ฅผ ๊ธธ๊ฒ ์ ๊ธฐ ์ซ์ด์ ๋๋ค์์ ์ผ๋ค..
Point ๊ฐ์ฒด์ hit์ผ๋ก ๋น๊ตํด hit์ด ์ ์ ๊ฐ ์์ผ๋ก ์ ๋ ฌํ์ฌ, front์ ์ต์๊ฐ์ด ์์นํ๋๋ก ํ๋ค.
- ๋ฐฉ๋ฌธ์ฒดํฌ : boolean[N][M]
์ฐ์ ์์ํ๋ฅผ ์จ์ BFS ํ์์ ํ๋ค๋ฉด, ๋จผ์ ์ด๋ค ์ง์ ์ ํ์์ ํ๊ฒ ๋๋ ๊ฒฝ์ฐ์์ ์ต์๊ฐ์ด ๋์ฌ ๊ฒ์ด๋ค. ์ด๋ฏธ ์ต์๊ฐ์ ๊ตฌํ๋ฌ ํ์์ ํ ์ง์ ์ ๋์ค์ ์ค๋ ๊ฒฝ์ฐ์์ ๋ค์ ํ์ํ ํ์๊ฐ ์์ด์ง๋ค. ๊ทธ๋์ ์ขํ๊ฐ๋ง ๊ฐ์ง๊ณ 2์ฐจ์์ผ๋ก ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ๋ ๊ฒ์ด ์ข๋ค.
1๋ฒ ํ์ด์์ ์ต์๊ฐ์ ๋์ด์๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ง์น๊ธฐ ํด์คฌ๋๋ฐ, ๋ฐฉ๋ฌธ ์ฒดํฌ๋ก ์ต์๊ฐ์ ๋์ด์๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ง์น๊ธฐ๋ฅผ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ํ์์์ด์ง๊ฒ ๋๋ค.
- ๋์ฐฉํ๋ ๊ฒฝ์ฐ BFS ์ข ๋ฃํ๊ธฐ
๊ฐ์ฅ ๋จผ์ ๋์ฐฉํ๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฒฝ์ ์ต์๋ก ๋ถ์๊ณ ๋์ฐฉํ๋ ๊ฒฝ์ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ ํ์๊ฐ ์์ด์ง๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ฐ๋ก BFS๋ฅผ ์ข ๋ฃํ๋ค.
2๋ฒ ํ์ด ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static char[][] graph;
static boolean[][] visited;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static class Point {
int x, y, hit;
Point(int x, int y, int hit) {
this.x = x;
this.y = y;
this.hit = hit;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken()); //๊ฐ๋ก ํฌ๊ธฐ
N = Integer.parseInt(st.nextToken()); //์ธ๋ก ํฌ๊ธฐ
graph = new char[N][M];
for(int i = 0; i < N; i++) {
String line = br.readLine();
for(int j = 0; j < M; j++) {
graph[i][j] = line.charAt(j);
}
}
visited = new boolean[N][M];
System.out.println(bfs(0, 0));
}
public static int bfs(int i, int j) {
Queue<Point> queue = new PriorityQueue<>((o1, o2) -> o1.hit - o2.hit);
queue.add(new Point(i, j, 0));
visited[i][j] = true;
while(!queue.isEmpty()) {
Point point = queue.poll();
if(point.x == N - 1 && point.y == M - 1) {
return point.hit;
}
for(int d = 0; d < 4; d++) {
int nx = point.x + dx[d];
int ny = point.y + dy[d];
if(0 > nx || nx >= N || 0 > ny || ny >= M) continue; //๋ฏธ๋ก ๋ฐ
if(graph[nx][ny] == '0' && !visited[nx][ny]) { //๋น ๋ฐฉ
queue.add(new Point(nx, ny, point.hit));
visited[nx][ny] = true;
} else if(graph[nx][ny] == '1' && !visited[nx][ny]) { //๋ฒฝ
queue.add(new Point(nx, ny, point.hit + 1));
visited[nx][ny] = true;
}
}
}
return 0;
}
}
2๋ฒ ํ์ด ๊ฒฐ๊ณผ
500ms๋์์ 100ms๋๋ก ์๊ฐ์ด ํ ์ค์๋ค.
์ฝ์์ ํ๋ฆฐํธ๋ก ์ฐ์ด๋ณด๋ ์์ ์ ๋ ฅ 1๋ก ํ์ ๊ฒฝ์ฐ, ์์์๋ ํธ์ถ ์นด์ดํธ๊ฐ 29์๋๋ฐ ์ด ํ์ด์์๋ 8๋ก ํ์ ์๊ฐ ํ ์ค์๋ค.
3. BFS + ๋ฑ (0-1 BFS)
๋ฐฑ์ค์์ ์ด ๋ฌธ์ ์ ์๊ณ ๋ฆฌ์ฆ ๋ถ๋ฅ๋ฅผ ๋ณด๋ '0-1 ๋๋น ์ฐ์ ํ์'์ด๋ผ๊ณ ์ ํ์์๋ค. ์ฒ์ ๋ค์ด๋ณด๋ ์๊ณ ๋ฆฌ์ฆ์ด์๋ค. ๊ตฌ๊ธ๋ง์ ํด๋ณด๋ ๊ฐ์ค์น๊ฐ 0๊ณผ 1๋ก๋ง ์ฃผ์ด์ง ๊ทธ๋ํ์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๋ ํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ๋ค.
- 0-1 BFS
๋ณดํต ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๊ธฐ๋ ํ๋๋ฐ, ๊ทธ๋ํ๊ฐ 0๊ณผ 1๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ ํน์ํ ํ๊ฒฝ์์ BFS ๊ณผ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋์ ์ ๋ฑ์ ์ฌ์ฉํ์ฌ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ์ ์๋ค.
์๊ณ ๋ฆฌ์ฆ ๋์ ๊ณผ์
1. ๋ฑ์ front์์ ์์๋ฅผ ๊บผ๋ธ๋ค.
2. ์ฐ๊ฒฐ๋ ์ง์ ์ ์ดํด๋ณธ๋ค.
3. ์ง๊ธ๊น์ง์ ๋น์ฉ์ ๊ทธ ์ง์ ์ผ๋ก ํฅํ๋ ๊ฐ์ค์น๋ฅผ ๋ํด ๋น์ฉ์ ๊ฐฑ์ ํ๋ค.
4. ๊ทธ ์ง์ ์ผ๋ก ํฅํ๋ ๊ฐ์ค์น๊ฐ 0์ด๋ฉด ๋ฑ์ front์ ๋ฃ๊ณ , ๊ฐ์ค์น๊ฐ 1์ด๋ฉด ๋ฑ์ back์ ๋ฃ๋๋ค.
2๋ฒ ํ์ด์์ BFS ๋ด์ ์ฐ์ ์์ํ๋ฅผ ๋ฑ์ผ๋ก ๋ฐ๊ฟ์คฌ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ ๋ฃ๋ ๋ถ๋ถ์์ 0์ด๋ฉด addFirst() ๋ฉ์๋๋ฅผ ์ฐ๊ณ , 1์ด๋ฉด addLast() ๋ฉ์๋๋ฅผ ์จ์ ์์๋ฅผ ์ฝ์ ํ๋ค.
3๋ฒ ํ์ด ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static char[][] graph;
static boolean[][] visited;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static class Point {
int x, y, hit;
Point(int x, int y, int hit) {
this.x = x;
this.y = y;
this.hit = hit;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken()); //๊ฐ๋ก ํฌ๊ธฐ
N = Integer.parseInt(st.nextToken()); //์ธ๋ก ํฌ๊ธฐ
graph = new char[N][M];
for(int i = 0; i < N; i++) {
String line = br.readLine();
for(int j = 0; j < M; j++) {
graph[i][j] = line.charAt(j);
}
}
visited = new boolean[N][M];
System.out.println(bfs(0, 0));
}
public static int bfs(int i, int j) {
Deque<Point> queue = new LinkedList<>();
queue.add(new Point(i, j, 0));
visited[i][j] = true;
while(!queue.isEmpty()) {
Point point = queue.poll();
if(point.x == N - 1 && point.y == M - 1) {
return point.hit;
}
for(int d = 0; d < 4; d++) {
int nx = point.x + dx[d];
int ny = point.y + dy[d];
if(0 > nx || nx >= N || 0 > ny || ny >= M) continue; //๋ฏธ๋ก ๋ฐ
if(graph[nx][ny] == '0' && !visited[nx][ny]) { //๋น ๋ฐฉ
queue.addFirst(new Point(nx, ny, point.hit));;
visited[nx][ny] = true;
} else if(graph[nx][ny] == '1' && !visited[nx][ny]) { //๋ฒฝ
queue.addLast(new Point(nx, ny, point.hit + 1));
visited[nx][ny] = true;
}
}
}
return 0;
}
}
3๋ฒ ํ์ด ๊ฒฐ๊ณผ
2๋ฒ ํ์ด ์๊ฐ์ด 156ms์ด์๋๋ฐ, 136ms๋ก ์๊ฐ์ด ์ค์๋ค. ๋ก์ง์ ๋ฌ๋ผ์ง ๊ฒ์ด ์๊ณ ์๋ฃ๊ตฌ์กฐ๋ง ์ฐ์ ์์ํ์์ ๋ฑ์ผ๋ก ๋ฐ๊ฟจ๋ค. ์ฐ์ ์์ํ๋ ๋์๊ณผ์ ์์ ์์๊ฐ ์ฝ์ ๋ ๋๋ง๋ค ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง๋๋ฐ, ๋ฑ์ ์๋ค๋ก ์ฝ์ ๋ง ์ผ์ด๋๋ ์ํ ์๊ฐ์์ ์ฐจ์ด๊ฐ ๋๋ ๊ฒ ๊ฐ๋ค.
๋ฐฐ์ด์
- 0-1 BFS
- ๊ฐ์ค์น๊ฐ 0๊ณผ 1๋ก๋ง ์ฃผ์ด์ง ๊ทธ๋ํ์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๋ ํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ
- BFS ๊ณผ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋์ ์ ๋ฑ์ ์ฌ์ฉ
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 1253๋ฒ : ์ข๋ค (0) | 2024.01.09 |
---|---|
๋ฐฑ์ค 16234๋ฒ : ์ธ๊ตฌ ์ด๋ (0) | 2023.09.25 |
๋ฐฑ์ค 7785๋ฒ : ํ์ฌ์ ์๋ ์ฌ๋ (0) | 2023.08.30 |
๋ฐฑ์ค 14442๋ฒ : ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ2 (0) | 2023.08.30 |
๋ฐฑ์ค 2206๋ฒ : ๋ฒฝ๋ถ์๊ณ ์ด๋ํ๊ธฐ (0) | 2023.08.30 |