[Algorithm] ๐Ÿงฑ๋ฐฑ์ค€ 2206 ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

HaJingJingยท2021๋…„ 6์›” 17์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
75/119

0. ๋ฌธ์ œ

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์„ ์ถœ๋ ฅํ•œ๋‹ค.

1. ์•„์ด๋””์–ด

๐Ÿ’ก ๋ง์ด ๋˜๊ณ ํ”ˆ ์›์ˆญ์ด์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ ์œ ํ˜•
๐Ÿ’ก 3์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•ด๋‚˜๊ฐ
( ํ•œ ๋ฐฐ์—ด์€ ๋ฒฝ์„ ๋ถ€์‰ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์šฉ๋„ )
๐Ÿ’ก ๋ฒฝ์„ ํ•œ ๋ฒˆ๋„ ์•ˆ ๋ถ€์‰ˆ์œผ๋ฉด, ๋ถ€์ˆ˜๊ธฐ
๐Ÿ’ก ๋ฒฝ์ด ์—†๋Š” ๊ณณ์ด๋ผ๋ฉด ๊ทธ๋ƒฅ ์ด๋™
๐Ÿ’ก ๋งˆ์ง€๋ง‰ ์นธ์— ๋„๋‹ฌํ•˜๋ฉด queue์—์„œ pollํ•œ cnt+1๊ฐ’์„ ์ถœ๋ ฅํ•จ

2. ํ•ต์‹ฌ ํ’€์ด

  1. 3์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•ด๋‚˜๊ฐ
    ( ํ•œ ๋ฐฐ์—ด์€ ๋ฒฝ์„ ๋ถ€์‰ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์šฉ๋„ )
dist = new int[n][m][2];
  1. ๋ฒฝ์„ ํ•œ ๋ฒˆ๋„ ์•ˆ ๋ถ€์‰ˆ์œผ๋ฉด, ๋ถ€์ˆ˜๊ธฐ
if(cur.wallBreak < 1) {
	if(map[nx][ny] == 1 && dist[nx][ny][cur.wallBreak+1] == 0) {
		dist[nx][ny][cur.wallBreak+1] = cur.cnt+1;
		q.add(new Node(nx,ny,cur.cnt+1, cur.wallBreak+1));
	}
}
  1. ๋ฒฝ์ด ์—†๋Š” ๊ณณ์ด๋ผ๋ฉด ๊ทธ๋ƒฅ ์ด๋™
if(map[nx][ny] == 0 && dist[nx][ny][cur.wallBreak] == 0) {
	dist[nx][ny][cur.wallBreak] = cur.cnt+1;
	q.add(new Node(nx, ny, cur.cnt+1, cur.wallBreak));
}
  1. ๋งˆ์ง€๋ง‰ ์นธ์— ๋„๋‹ฌํ•˜๋ฉด queue์—์„œ pollํ•œ cnt+1๊ฐ’์„ ์ถœ๋ ฅํ•จ
if(cur.x == n-1 && cur.y == m-1) {
	ret = cur.cnt+1;
	break;
}

3. ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Queue;
import java.util.LinkedList;
public class Bruteforce_12 {
	static int[][] map;
	static int[][][] dist;
	static int[] dx = {0,0,1,-1};
	static int[] dy = {1,-1,0,0};
	static int n,m;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] s = br.readLine().split(" ");
		
		n = Integer.parseInt(s[0]);
		m = Integer.parseInt(s[1]);
		map = new int[n][m];
		dist = new int[n][m][2];
		
		for(int i=0; i<n; i++) {
			s = br.readLine().split("");
			for(int j=0; j<m; j++) {
				map[i][j] = Integer.parseInt(s[j]);
			}
		}
		
		System.out.println(bfs());
		
	}
	
	static int bfs() {
		Queue<Node> q = new LinkedList<>();
		q.add(new Node(0,0,0,0));
		dist[0][0][0] = 0;
		int ret = -1;
		
		while(!q.isEmpty()) {
			Node cur = q.poll();
			
			if(cur.x == n-1 && cur.y == m-1) {
				ret = cur.cnt+1;
				break;
			}
			
			for(int i=0; i<4; i++) {
				int nx = cur.x + dx[i];
				int ny = cur.y + dy[i];
				
				if(nx < 0 || ny < 0 || nx>=n || ny>= m)
					continue;
				
				if(cur.wallBreak < 1) {
					if(map[nx][ny] == 1 && dist[nx][ny][cur.wallBreak+1] == 0) {
						dist[nx][ny][cur.wallBreak+1] = cur.cnt+1;
						q.add(new Node(nx,ny,cur.cnt+1, cur.wallBreak+1));
					}
				}
				
				if(map[nx][ny] == 0 && dist[nx][ny][cur.wallBreak] == 0) {
					dist[nx][ny][cur.wallBreak] = cur.cnt+1;
					q.add(new Node(nx, ny, cur.cnt+1, cur.wallBreak));
				}
			}
		}
		
		return ret;
	}

	static class Node {
		int x;
		int y;
		int cnt;
		int wallBreak;
		Node(int x, int y, int cnt, int wallBreak){
			this.x = x;
			this.y = y;
			this.cnt = cnt;
			this.wallBreak = wallBreak;
		}
	}
}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณตโœจ
์™œ 2์ฐจ์› ๋ฐฐ์—ด์œผ๋กœ๋Š” ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ• ๊นŒ?..

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€