Coding Test Study/Programmers

[Java] 미로 탈출

똑똑한망치 2024. 2. 25. 15:10
728x90
반응형

1. 문제

지도는 세로가 N, 가로가 M인 2차원 정수 배열 maze 로 주어져 있으며, 현재 위치는 (0, 0)이고 출구의 위치는 (N-1, M-1) 이다.

지도에는 갈 수 있는 위치는 0 으로, 갈 수 없는 위치는 1 로 표기되어 있다.

이 때, 미로를 가장 빠르게 탈출할 경우의 이동 횟수를 출력하시오.

단, 미로를 탈출할 수 없는 경우에는 -1을 출력하시오.

 

 

2. 입력 설명

  • 0 < N <= 1000
  • 0 < M <= 1000

 

3. 출력 설명

미로를 탈출하는 데에 필요한 최소 이동 횟수를 정수로 출력

 

 

4. 매개변수 형식

N = 6

M = 6

maze =  {{0, 0, 0, 0, 0, 0},
        {0, 1, 1, 1, 1, 0},
        {0, 1, 0, 0, 0, 0},
        {1, 1, 0, 1, 0, 1},
        {0, 0, 0, 0, 1, 0},
        {1, 1, 1, 0, 0, 0}}

 

 

 

 

5. 반환값 형식

16

 

 

6. 코드 구현

힌트 : BFS

 

import java.util.LinkedList;
import java.util.Queue;

class Solution {

    public int solution(int N, int M, int[][] maze) {

        // BFS 이므로 Queue 사용
        Queue<int[]> q = new LinkedList<>();

        // 현재 위치
        q.offer(new int[]{0, 0});

        int[] xArray = {0, 0, 1, -1};
        int[] yArray = {1, -1, 0, 0};

        // 방문여부 및 방문 횟수 저장
        // 만약 0이라면 방문한 적 X
        int[][] visited = new int[N][M];

        while (!q.isEmpty()) {
            int[] currentLocation = q.poll();
            int x = currentLocation[0];
            int y = currentLocation[1];

            // 도착지점에 도착하면 방문횟수 바로 반환
            if (x == N - 1 && y == M - 1) {
                return visited[x][y];
            }

            for (int i = 0; i < 4; i++) {
                int newX = x + xArray[i];
                int newY = y + yArray[i];

                // 새로운 좌표가 미로 바깥에 위치할 때
                if (newX < 0 || newX >= N || newY < 0 || newY >= M) {
                    continue;
                }

                // 새로운 좌표가 갈 수 있는 위치이고,
                // 방문한 적이 없는 경우
                if (maze[newX][newY] == 0 && visited[newX][newY] == 0) {
                    q.offer(new int[]{newX, newY});
                    visited[newX][newY] = visited[x][y] + 1;
                }
            }
        }
        return -1;
    }
}

 

반응형

'Coding Test Study > Programmers' 카테고리의 다른 글

[Java] k 자리 제거하기  (0) 2024.03.22
[Java] 선을 넘나드는 사각형  (1) 2024.03.22
[Java] 카지노 교환원  (0) 2024.02.25
[Java] 이어 붙인 문자열  (1) 2024.02.25
[Java] 사전식 배열  (1) 2024.02.25