본문 바로가기
알고리즘/백준 - 실버

백준 2178 미로 탐색

by 호롤롤로루야 2021. 9. 3.

백준 2178 미로 탐색

1. 문제 링크

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

 

2178번: 미로 탐색

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

www.acmicpc.net

 

2. 문제 해결에 대한 아이디어

1. 2차원 배열로 생각했을 때, 좌측 끝 상단에서 우측 끝 하단으로 이동한다.

2. 따라서 (0, 0)에서 (N-1, M-1)로 이동한 것으로 구현했다.

3. 지나야 하는 칸의 개수를 세기 위해 방문 배열은 int로 구현했다.

4. 현재 칸의 가중치는 이전 칸의 가중치의 + 1로 기록한다.

5. 가중치가 기록되어있는 visited 배열 중, visited [N-1][M-1]에 있는 가중치를 출력한다.

 

3. 코드

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 Main {

	static int[][] arr;
	static int[][] weight;
	static boolean[][] visited;
	static int[] di = { 0, 0, 1, -1 };
	static int[] dj = { 1, -1, 0, 0 };
	static int N, M;

	static class Pair {
		int i, j;

		public Pair(int i, int j) {
			super();
			this.i = i;
			this.j = j;
		}

	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		st = new StringTokenizer(br.readLine(), " ");
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());

		arr = new int[N][M];
		weight = new int[N][M];
		visited = new boolean[N][M];

		for (int i = 0; i < N; i++) {
			String[] line = br.readLine().split("");
			for (int j = 0; j < M; j++) {
				arr[i][j] = Integer.parseInt(line[j]);
			}
		}

		Queue<Pair> q = new LinkedList<>();
		q.add(new Pair(0, 0));
		visited[0][0] = true;
		weight[0][0] = 1;

		while (!q.isEmpty()) {
			Pair now = q.poll();

			for (int k = 0; k < 4; k++) {
				int ii = now.i + di[k];
				int jj = now.j + dj[k];

				if (ii < 0 || ii >= N || jj < 0 || jj >= M 
						|| visited[ii][jj] || arr[ii][jj] != 1)
					continue;

				visited[ii][jj] = true;
				weight[ii][jj] = weight[now.i][now.j] + 1;
				q.add(new Pair(ii, jj));
			}

		}

		System.out.println(weight[N - 1][M - 1]);
	}
}
 

4. 채점 결과

 

5. 느낀 점

1. 가장 기본적인 BFS 문제여서 어려움이 없었다.

2. 방문 배열을 int로 선언하는 것만 신경 쓰면 되는 문제였다.

 

'알고리즘 > 백준 - 실버' 카테고리의 다른 글

백준 6603 로또  (0) 2021.12.27
백준 7576 토마토  (0) 2021.09.07
백준 1012 유기농 배추  (0) 2021.09.06
백준 4963 섬의 개수  (0) 2021.09.06
백준 2468 안전 영역  (0) 2021.09.03

댓글