티스토리 뷰

728x90
:D 문제

문제

N×M크기의 배열로 표현되는 미로가 있다.

1 0 1 1 1 1
1 0 1 0 1 0
1 0 1 0 1 1
1 1 1 0 1 1

미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.

위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.

입력

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

출력

첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.

Baekjoon

 

2178번: 미로 탐색

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

www.acmicpc.net

 

 
:D 풀이 방법

나는 위치 좌표와 지나온 칸의 수를 저장하기 위해 Point 클래스를 만들었다. 그리고 bfs탐색을 진행했다.

방문여부와 이동 할 수 있는지를 확인하고, 이동이 가능하다면 현재 Point의 count에 1만큼 증가시켜 큐에 저장하였다. 그리고 최종 목적지인 graph[N-1][M-1] 위치에 도착했다면 해당 위치의 count를 리턴시켜 해결하였다.

 

 
:D 작성 코드

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

public class Solution2178H {

    // 좌표와 경로까지 가기 위한 칸의 수 저장할 클래스
    static class Point {
        int x, y, count;

        public Point(int x, int y, int count) {
            this.x = x;
            this.y = y;
            this.count = count;
        }
    }

    // 4방 탐색
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    static int[][] graph;
    static boolean[][] visited;
    static int N, M;

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tokenizer = new StringTokenizer(br.readLine(), " ");

        N = Integer.parseInt(tokenizer.nextToken());
        M = Integer.parseInt(tokenizer.nextToken());
        graph = new int[N][M];
        visited = new boolean[N][M];

        for (int i = 0; i < N; i++) {
            char[] line = br.readLine().toCharArray();
            for (int j = 0; j < M; j++) {
                graph[i][j] = line[j] - '0';
            }
        }
        System.out.println(bfs(new Point(0, 0, 1)));
    }

    private static int bfs(Point point) {

        Queue<Point> queue = new ArrayDeque<>();

        // 시작 정점 방문 표시
        queue.offer(point);
        visited[point.x][point.y] = true;

        while (!queue.isEmpty()) {

            Point current = queue.poll();

            // 목표지에 도달하면 리턴
            if (current.x == N - 1 && current.y == M - 1) {
                return current.count;
            }

            for (int i = 0; i < 4; i++) {

                int nx = current.x + dx[i];
                int ny = current.y + dy[i];

                // 범위 체크
                if (!isIn(nx, ny)) continue;

                // 방문 가능하다면
                if (!visited[nx][ny] && graph[nx][ny] != 0) {
                    queue.offer(new Point(nx, ny, current.count + 1));
                    visited[nx][ny] = true;
                }
            }
        }
        return -1;
    }

    private static boolean isIn(int x, int y) {
        return x >= 0 && y >= 0 && x < N && y < M;
    }
}
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크