Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

도누쓰코딩죽이기

[백준] 2178 미로 탐색 본문

알고리즘CPR

[백준] 2178 미로 탐색

차도누 2020. 8. 8. 22:44

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

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

문제 정리

N x M 크기의 미로가 있음 
1 : 이동할 수 있는 칸 
0 : 이동할 수 없는 칸 
   
(1,1) -> (N,M) 위치로 이동할 때 지나야 하는 최소의 칸 수? 
서로 인접한 칸으로만 이동 가능 

 

소스코드 

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

public class Main_2178_미로탐색 {
	
	static int N, M;
	static int map[][];
	static boolean visited[][];
	static int dir[][] = {{-1,0},{1,0},{0,-1},{0,1}};
	public static void main(String[] args) throws Exception{
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine());
		
		// =========== 입력 ================
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		
		map = new int [N][M];
		visited = new boolean[N][M];
		
		for (int i = 0; i < N; i++) {
			String line = in.readLine();
			for (int j = 0; j < M; j++) {
				map[i][j] = line.charAt(j) - '0';
			}
		}
	
		// =========== 풀이 ================
		//일단 1,1 지점 -> 여기서는 0,0지점을 큐에 넣음
		Queue<int[]> queue = new LinkedList<int[]>();
		
		queue.offer(new int[] {0,0,1});	// 첫 좌표를 큐에 넣엇음
		visited[0][0] = true;
		
		while(!queue.isEmpty()) {
			int cur[] = queue.poll();
			int r = cur[0];
			int c = cur[1];
			int cnt = cur[2];
			
			if(r==N-1 && c ==M-1) {
				System.out.println(cnt);
				break;
			}
			//4방탐색
			for (int d = 0; d < 4; d++) {
				int nr = r + dir[d][0];
				int nc = c + dir[d][1];
				if(isin(nr,nc) && map[nr][nc]==1 &&!visited[nr][nc]) {
					visited[nr][nc] = true;
					queue.offer(new int[] {nr,nc,cnt+1});
				}
			}
			
			
		}
	}
	private static boolean isin(int r, int c) {

		return r>=0 && r<N && c>=0 && c<M;
	}

}

 

소스코드 풀이

1. Queue에 1. row, 2. col, 3. 움직인 횟수를 넣었음

2. (N,M) 지점에 오면 바로 움직인 횟수를 출력하고 종료

3. BFS이기 때문에 큐에 넣기 직전에 방문체크 -> 요렇게 안하면 한 지점을 여러번 탐색하는 일이 있을 수 있음

 

 

Review

시작점(0,0) 과 종료지점(N,M) 이 무조건 주어지고 연결되어 있기 때문에 BFS개념을 잘 알고 있다면 무난하게 풀 수 있는 문제. 알고리즘 문제를 풀 때 좀 마음이 급한거 같다. 천천히 문제를 정리하고 논리적으로 풀어나가는 연습을 해야겠다. 

 

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

[백준] 2606 바이러스  (0) 2020.08.15
[백준] 14502 연구소  (0) 2020.08.08
[백준] 11403 경로 찾기  (0) 2020.08.04
[백준] 6603 로또  (1) 2020.08.02
알고리즘 심폐소생 시작  (0) 2020.08.02