λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜/문제

[μžλ°”] λ°±μ€€ 2206 - λ²½ λΆ€μˆ˜κ³  μ΄λ™ν•˜κΈ°

by applemango2021 2020. 12. 12.

γ…Žγ…Žγ…Žγ…Žλ©”λͺ¨λ¦¬λ„ λ„ˆλ¬΄ 많이 μ‚¬μš©ν•˜κ³  속도도 λŠλ €μ„œ μ΄λ ‡κ²Œ μ €λ ‡κ²Œ λ‚˜λ¦„ λ°”κΏ”λ΄€μ§€λ§Œ λ³€ν•˜μ§€λ₯Ό μ•Šμ•˜λ‹€. μ†λ„λŠ” κ·Έλ ‡λ‹€ 쳐도 λ©”λͺ¨λ¦¬κ°€ λ„ˆλ¬΄ μ˜μ•„ν–ˆλ‹€. classν•˜λ‚˜ μƒμ„±ν•΄μ„œ 큐에 μ§‘μ–΄λ„£μ–΄μ€˜μ•Ό ν•˜λ‚˜..?λŠ” 생각이 λ“€μ—ˆμ§€λ§Œ, μ˜ˆμ „μ— ν’€μ—ˆλ˜ μ†ŒμŠ€λ„ intλ°°μ—΄λ‘œ ν’€μ—ˆλŠ”λ° 뭐가 λ¬Έμ œμ§€ κ³ λ―Όν–ˆλ‹€. 

근데 방금 이유λ₯Ό ν•˜λ‚˜ μ°Ύμ•„λƒˆλŠ”λ° λ„ˆλ¬΄ 어이가 μ—†λ‹€. BFSν•  λ•Œ κΌ­ λ“€μ–΄κ°€λŠ” dir[] 배열을 queμ•ˆμ—μ„œ 맀번 μ„ μ–Έ/μƒμ„±ν•˜μ§€ μ•Šκ³  que만 밖에닀가 μ„ μ–Έν•΄μ„œ μΌλ”λ‹ˆ 1/3이 μ€„μ—ˆλ‹€ γ…Žγ…Ž,,어이없넀 

 

μ½”λ“œλŠ” κ·Έλƒ₯ 맨 처음 μ‹œλ„ν•΄μ„œ μ„±κ³΅ν•œ μ½”λ“œλΌ μ΅œμ ν™” μ „ν˜€ μ•ˆ λ˜μ–΄ μžˆλ‹€.

처음 μ‹œλ„ν•  λ•Œμ—λŠ” ν‹€λ Έμ—ˆλŠ”λ°, λ°©λ¬Έ μ—¬λΆ€λ₯Ό λΆ€μˆ˜κ³  듀어왔을 λ•Œ, λΆ€μˆ˜μ§€ μ•Šκ³  듀어왔을 λ•Œ λ‚˜λˆ μ„œ μƒκ°ν•˜μ§€ μ•Šμ•„μ„œ ν‹€λ Έλ‹€. μ–΄μ°¨ν”Ό κ·Έ 지점에 λ„μ°©ν•œ κ±°λ©΄ 상관없지 μ•Šλ‚˜??λΌλŠ” 생각에 κ·Έλž¬λŠ”λ°, λ‹€μŒμ— 또 λΆ€μˆ˜κ³  갈 수 μžˆλƒ μ—†λƒμ˜ 차이가 λ°œμƒν•˜λ‹ˆκΉŒ κ½€ 큰 μ°¨μ΄μ˜€λ‹€. 

/* 2020.12.12(ν† )*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

//λ™μΌν•œ μ’Œν‘œμ— λŒ€ν•΄μ„œ, 벽을 λΆ€μˆ˜κ³  μ˜¨κ±°λž‘ λ²½ λΆ€μˆ˜μ§€ μ•Šκ³  μ˜¨κ±°λž‘ λ°©λ¬Έμ—¬λΆ€ 체크λ₯Ό 달리 ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. 
public class Main{

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] str = br.readLine().trim().split(" ");
		int N = Integer.parseInt(str[0]);
		int M = Integer.parseInt(str[1]);
		
		int[][] map = new int[N][M];
		boolean[][][] visited = new boolean[2][N][M];
		
		for(int i=0;i<N;i++) {
			str = br.readLine().trim().split("");
			for(int j=0;j<M;j++) {
				map[i][j] = Integer.parseInt(str[j]);
			}
		}
		
		Queue<int[]> que = new LinkedList<int[]>();
		//nμœ„μΉ˜, mμœ„μΉ˜, λ²½λΆ€μ‹€ 수 μžˆλŠ” 횟수, 횟수
		que.offer(new int[] {0,0,1,1});
		
		int[] tmp;
		int n,m,wall;
		int count=0;
		int newN,newM;
		boolean isArrived = false;
		while(!que.isEmpty()) {
			tmp = que.poll();
			n = tmp[0];
			m = tmp[1];
			wall = tmp[2];
			count = tmp[3];
			
			if(n==N-1 && m==M-1) {
				isArrived = true;
				break;
			}
			
			int[][] dir = {{1,0},{-1,0},{0,1},{0,-1}};
			for(int d=0;d<4;d++) {
				newN = n + dir[d][0];
				newM = m + dir[d][1];
				
				if(newN>=0 && newN<N && newM>=0 && newM<M) {
					
					if(map[newN][newM]==0 && !visited[wall][newN][newM]) {
						visited[wall][newN][newM] = true;
						que.offer(new int[] {newN,newM,wall,count+1});
					}
						
					else if(map[newN][newM]==1 && wall==1 && !visited[wall-1][newN][newM]) {
						visited[wall-1][newN][newM] = true;
						que.offer(new int[] {newN,newM,wall-1,count+1});
					}	
				}
			}
		}	
		if (isArrived) System.out.println(count);
		else System.out.println(-1);
	}
}