[백준] 2178 문제 - 미로탐색(Java) BufferedReader 사용 풀이 방법

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

 

2178번: 미로 탐색

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

www.acmicpc.net

 

 

이 문제는 (1,1) 위치에서 (N,M) 위치로 가는데 최소 칸수를 구하는 문제이다.

 

최단 경로 문제는 BFS 를 사용하면 된다고 생각하면 된다.  BFS는 갈 수 있는 인접한 경로를 모두 방문하기 때문에 최초 방문된 시점이 출발 노드점에서 갈 수 있는 가장 빠른 경로이기 때문이다. 그래서 이문제도 BFS로 풀면 된다. 최단경로 문제는 BFS로 푼다는 걸 공식처럼 생각하면 된다.

 

시간 복잡도는 인접 행렬을 사용할거기 때문에 N, M의 최댓값이 100이어서 100 * 100 = 10000이다.

 

이 문제는 살짝 까다로운 부분이 입력 부분인데 보통 입력의 각 수들을 공백 단위로 띄워서 주지만 이 문제는 붙여서 준다. 그래서 문제 입력 설명 부분에서 붙여서를 진하게 표시한 것 같다. 

 

직면한 문제와 풀이 방법

문자열로 붙여서 나온 각 수 들을 어떻게 떨어뜨릴지에 대한 문제를 직면했다.

for (int y = 0; y < mapYSize; y++) {
    st = new StringTokenizer(br.readLine());
    String inputStr = st.nextToken();

    for (int x = 0; x < mapXSize; x++) {
        map[y][x] = inputStr.charAt(x) - '0';
    }
}

BufferedReader와 StringTokenizer() 를 이용하여 각 붙여준 수를 String으로 받아서 각 String 한자리 한자리 마다 char() -'0' 를 이용해서 숫자로 변환 후 배열에 담아 풀었다.

 

전체 풀이 코드

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

//https://www.acmicpc.net/problem/2178
public class 미로탐색 {
    /**
     * 1. 아이디어
     * - (1,1)위치에서 (N,M)위치로가는 최소의 칸 수 구하기
     * -
     * <p>
     * 2. 시간 복잡도
     * - 100 * 100 = 10000
     * <p>
     * 3. 변수
     * - 미로 : map[mapYSize][mapXSize]
     * - 방문체크 : isVisited[mapYSize][mapXsize]
     * - 방문 : dx[]{0, 1, 0, -1}, dy[]{-1, 0, 1, 0}
     */

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;

    static int[][] map;
    static int mapXSize, mapYSize;
    static boolean[][] isVisited;
    static final int[] dy = new int[]{1, 0, -1, 0};
    static final int[] dx = new int[]{0, 1, 0, -1};

    private static void input() throws IOException {
        st = new StringTokenizer(br.readLine());
        mapYSize = Integer.parseInt(st.nextToken());
        mapXSize = Integer.parseInt(st.nextToken());

        map = new int[mapYSize][mapXSize];
        isVisited = new boolean[mapYSize][mapXSize];

        for (int y = 0; y < mapYSize; y++) {
            st = new StringTokenizer(br.readLine());
            String inputStr = st.nextToken();

            for (int x = 0; x < mapXSize; x++) {
                map[y][x] = inputStr.charAt(x) - '0';
            }
        }
    }

    public static void main(String[] args) throws IOException {
        input();

        solve();

        print();
    }

    private static void print() {
        System.out.print(map[mapYSize - 1][mapXSize - 1]);
    }

    private static void solve() {
        isVisited[0][0] = true;
        bfs(0, 0);
    }

    private static void bfs(int mapY, int intX) {
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[]{mapY, intX});

        while (!queue.isEmpty()) {
            int[] curXY = queue.poll();

            for (int i = 0; i < dx.length; i++) {
                int qy = dy[i] + curXY[0];
                int qx = dx[i] + curXY[1];
                int curMin = map[curXY[0]][curXY[1]];

                if (0 <= qx && qx < mapXSize && 0 <= qy && qy < mapYSize && map[qy][qx] == 1 && !isVisited[qy][qx]) {
                    map[qy][qx] = curMin + 1;
                    isVisited[qy][qx] = true;
                    queue.add(new int[]{qy, qx});
                }
            }
        }
    }
}

 

 

댓글

Designed by JB FACTORY