๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 2206_๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

๋ฟŒ์•ผ._. 2022. 10. 23. 22:49

Gold IV

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/2206)

<๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ>

๋ฌธ์ œ 

 

N×M์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ๋งต์ด ์žˆ๋‹ค. ๋งต์—์„œ 0์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ด๊ณ , 1์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ์ด ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹น์‹ ์€ (1, 1)์—์„œ (N, M)์˜ ์œ„์น˜๊นŒ์ง€ ์ด๋™ํ•˜๋ ค ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋ ค ํ•œ๋‹ค. ์ตœ๋‹จ๊ฒฝ๋กœ๋Š” ๋งต์—์„œ ๊ฐ€์žฅ ์ ์€ ๊ฐœ์ˆ˜์˜ ์นธ์„ ์ง€๋‚˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๋งํ•˜๋Š”๋ฐ, ์ด๋•Œ ์‹œ์ž‘ํ•˜๋Š” ์นธ๊ณผ ๋๋‚˜๋Š” ์นธ๋„ ํฌํ•จํ•ด์„œ ์„ผ๋‹ค.

๋งŒ์•ฝ์— ์ด๋™ํ•˜๋Š” ๋„์ค‘์— ํ•œ ๊ฐœ์˜ ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊ฒฝ๋กœ๊ฐ€ ์งง์•„์ง„๋‹ค๋ฉด, ๋ฒฝ์„ ํ•œ ๊ฐœ ๊นŒ์ง€ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜์—ฌ๋„ ๋œ๋‹ค.

ํ•œ ์นธ์—์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ์นธ์ด๋‹ค.

๋งต์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด ๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

 

์ž…๋ ฅ

 

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— M๊ฐœ์˜ ์ˆซ์ž๋กœ ๋งต์ด ์ฃผ์–ด์ง„๋‹ค. (1, 1)๊ณผ (N, M)์€ ํ•ญ์ƒ 0์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž.

 

์ถœ๋ ฅ 

 

์ฒซ์งธ ์ค„์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

 

 - my solution (Java)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class _2206_ { // ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ
	static int arr[][], depth[][][],n,m;
	static boolean visited[][][];
	static int dx[]= {-1,1,0,0};
	static int dy[]= {0,0,-1,1};
	public static void main(String[] args) throws IOException {
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(bf.readLine());
		
		n=Integer.parseInt(st.nextToken());
		m=Integer.parseInt(st.nextToken());
		
		arr=new int[n][m];
		depth=new int[n][m][2];
		visited=new boolean[n][m][2];
		for(int i=0; i<n; i++) {
			String s=bf.readLine();
			for(int j=0; j<m; j++) {
				arr[i][j]=s.charAt(j)-'0';
			}
		}
		search();
		int answer=Integer.MAX_VALUE;
		if(depth[n-1][m-1][0] !=0) {
			answer=depth[n-1][m-1][0];
		}
		if(depth[n-1][m-1][1]!=0 && answer>depth[n-1][m-1][1]) {
			answer=depth[n-1][m-1][1];
		}
		if(answer==Integer.MAX_VALUE) answer=-1;
		System.out.println(answer);
	}
	private static void search() {
		Queue<int[]>queue=new LinkedList<>();
		queue.add(new int[] {0,0,0});
		depth[0][0][0]=1;
		visited[0][0][0]=true;
		
		while(!queue.isEmpty()) {
			int temp[]=queue.poll();
			
			for(int i=0; i<4; i++) {
				int x=temp[0]+dx[i];
				int y=temp[1]+dy[i];
				if(x>=0 && x<n && y>=0 && y<m) {
					if(arr[x][y]==0) {
						if(!visited[x][y][temp[2]] || depth[x][y][temp[2]]>depth[temp[0]][temp[1]][temp[2]]+1) {
							visited[x][y][temp[2]]=true;
							depth[x][y][temp[2]]=depth[temp[0]][temp[1]][temp[2]]+1;
							queue.add(new int[] {x,y,temp[2]});
						}
					}
					if(arr[x][y]==1 && temp[2]==0) {
						if(!visited[x][y][temp[2]+1] || depth[x][y][temp[2]+1]>depth[temp[0]][temp[1]][temp[2]]+1) {
							visited[x][y][temp[2]+1]=true;
							depth[x][y][temp[2]+1]=depth[temp[0]][temp[1]][temp[2]]+1;
							queue.add(new int[] {x,y,1});
						}
					}
				}
			}
		}
	}
}

 

  •  Main
    • n, m ์ž…๋ ฅ
    • arr : ๋งต ์ž…๋ ฅ
    • depth, visited : ๊ฒฝ๋กœ ๊นŠ์ด ์ €์žฅ, ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ‘œ์‹œ
    • ๋งต ์ž…๋ ฅ ํ›„ search ํ•จ์ˆ˜ ํ˜ธ์ถœ
    • answer : ์ตœ๋‹จ ๊ฒฝ๋กœ
      ๋ฒฝ์„ ํ•˜๋‚˜๋„ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ  ๋„์ฐฉํ•  ๋•Œ์™€ ๋ฒฝ์„ 1๊ฐœ ๋ถ€์ˆ˜๊ณ  ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ ์ค‘ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜์—ฌ ์ €์žฅ
      ๋„์ฐฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ -1 ์ถœ๋ ฅ
  • search ( )
    • queue๋ฅผ ์„ ์–ธํ•˜์—ฌ ์ดˆ๊ธฐ ์‹œ์ž‘ ์œ„์น˜ ์ €์žฅ 
      ์‹œ์ž‘ํ•˜๋Š” ์นธ๋„ ํฌํ•จ์ด๋ฏ€๋กœ depth (0,0)๋ฅผ 1๋กœ ์ง€์ • ๋ฐ ๋ฐฉ๋ฌธ ํ‘œ์‹œ
    • queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
      • queue์—์„œ ๊ฐ’์„ ๊บผ๋‚ด ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰
        • map ๋ฒ”์œ„ ์•ˆ์ด๋ฉฐ ๋ฒฝ์ด ์•„๋‹ˆ๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์œผ๋ฉด update
        • map ๋ฒ”์œ„ ์•ˆ์ด๋ฉฐ ๋ฒ…์ด๊ณ  ์•„์ง ๋ฒฝ์„ ๋ถ€์ˆœ ์ ์ด ์—†๋‹ค. ๋˜ํ•œ, ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์œผ๋ฉด ๋ฐฉ๋ฌธ ํ‘œ์‹œ ๋ฐ ๋ฒฝ ๋ถ€์ˆ˜๊ณ ,  update

์ƒ๊ฐ๐Ÿค”

 

์˜ˆ์ „์— ์ด ๋ฌธ์ œ๋ฅผ ๋ดค์„ ๋•Œ ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผ ํ• ๊นŒ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ ๋ชฐ๋ผ์„œ ๋„˜๊ฒผ๋˜ ๋ฌธ์ œ์˜€๋‹ค.

ํ•˜์ง€๋งŒ '๋ง์ด ๋˜๊ณ ํ”ˆ ์›์ˆญ์ด' ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋ฉด์„œ ์ด ๋ฌธ์ œ๋„ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ’€๋ฉด ๋˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

 

depth์™€ visited๋ฅผ  (x์ขŒํ‘œ, y์ขŒํ‘œ, ์ฐจ์›)๊ณผ ๊ฐ™์ด 3์ฐจ์› ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜์—ฌ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ด ๋ฌธ์ œ์—์„œ depth [1][2][0]์ด๋ผ๊ณ  ํ•˜๋ฉด ์•„์ง ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ  (1,2) ์œ„์น˜์— ๋„์ฐฉํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

depth [2][3][1]์ด๋ผ๋ฉด ๋ฒฝ์„ ํ•˜๋‚˜ ๋ถ€์ˆ˜๊ณ  (2,3)๊นŒ์ง€ ์™”๋‹ค๋Š” ๋œป์ด๋‹ค.

 

์ด๋Ÿฐ ์‹์œผ๋กœ ์ƒ๊ฐํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.