본문 바로가기

알고리즘

백준 2206 <벽 부수고 이동하기>

728x90

이전의 https://www.acmicpc.net/problem/1600

 

1600번: 말이 되고픈 원숭이

첫째 줄에 정수 K가 주어진다. 둘째 줄에 격자판의 가로길이 W, 세로길이 H가 주어진다. 그 다음 H줄에 걸쳐 W개의 숫자가 주어지는데, 0은 아무것도 없는 평지, 1은 장애물을 뜻한다. 장애물이 있��

www.acmicpc.net

이 문제를 풀기 전에 추천했던 문제이다.

 

이 문제의 중점은 1번 뚫은 지점과 그렇지 않은 지점 방문처리를 어떻게 해주냐?이다. 

 

이 중점의 답은 방문처리하는 vistit 2차원 배열을 안 뚫은 것을 체크하기 위한 하나, 뚫은 것을 체크하기 위한 하나 총 2개로 3차원 배열을 만드는 것이다.

이 클래스는 x,y 좌표와 시간을 담은 t , 벽을 뚫은 횟수를 담은 num으로 구성되어있다.

이렇게 p.num이 0일때는 벽을 뚫어야 할 경우가 있으면 뚫어서 다음 큐에 num에 1을 더해 넣어준다.

 

이문제를 풀면서 느낀것은 3차원 배열을 접해보지 않았던 사람들은 문제를 접근하는데 어려움이 있을 것이라고 본다.

 

3차원 배열은 간단하게 말하자면 2차원 배열이 여러개 있는 것이라고 생각을 하면 된다.

 

전체 코드

더보기
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main{

	public static class pont {
		int x;
		int y;
		int t;
		int num;

		public pont(int x, int y, int num, int t) {
			this.x = x;
			this.y = y;
			this.t = t;
			this.num = num;
		}
	}

	static int n, m;
	static String map[];
	static int visit[][][], dir[][] = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } };
	static Queue<pont> q;
	static int result = -1;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner kb = new Scanner(System.in);
		q = new LinkedList<pont>();
		n = kb.nextInt();
		m = kb.nextInt();
		map = new String[n];
		visit = new int[n][m][2];

		for (int i = 0; i < n; i++) {
			map[i] = kb.next();
		}
		q.add(new pont(0, 0, 0, 1));
		start();
		System.out.println(result);
	}

	public static void start() {
		while (!q.isEmpty()) {
			pont p = q.remove();
			if(p.x==n-1&&p.y==m-1){
				result=p.t;
				return;
			}
			for (int i = 0; i < 4; i++) {
				int x1 = p.x + dir[i][0];
				int y1 = p.y + dir[i][1];
				if(x1>=0&&x1<n&&y1>=0&&y1<m&&visit[x1][y1][p.num]==0&&map[x1].charAt(y1)=='0'){
					visit[x1][y1][p.num]=1;
					q.add(new pont(x1,y1,p.num,p.t+1));
				}
				if (p.num < 1) {
					if(x1>=0&&x1<n&&y1>=0&&y1<m&&visit[x1][y1][p.num]==0
                       &&map[x1].charAt(y1)=='1'){
						visit[x1][y1][p.num]=1;
						q.add(new pont(x1,y1,p.num+1,p.t+1));
					}
				}
				
			}
			

		}
	}

}

'알고리즘' 카테고리의 다른 글

백준 1753 <최단 경로>  (0) 2020.09.01
백준 18513 <샘터>  (0) 2020.08.31
백준 2615 <오목>  (0) 2020.08.29
백준 15961 <회전초밥>  (1) 2020.08.28
백준 3109 <빵집>  (0) 2020.08.27