https://www.acmicpc.net/problem/1261

 

1261๋ฒˆ: ์•Œ๊ณ ์ŠคํŒŸ

์ฒซ์งธ ์ค„์— ๋ฏธ๋กœ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ€๋กœ ํฌ๊ธฐ M, ์„ธ๋กœ ํฌ๊ธฐ N (1 โ‰ค N, M โ‰ค 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๋ฏธ๋กœ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž 0๊ณผ 1์ด ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ๋ฐฉ์„ ์˜๋ฏธํ•˜๊ณ , 1์€ ๋ฒฝ์„ ์˜๋ฏธ

www.acmicpc.net

 

 

 

 

 

๋ฌธ์ œ

์š”์•ฝ

  • ํ˜„์žฌ (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 ๊ณผ์ •์—์„œ ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋Œ€์‹ ์— ๋ฑ์„ ์‚ฌ์šฉ
giraffe_