알고리즘/프로그래머스

[프로그래머스] 게임 맵 최단거리

sm.jeon 2024. 1. 10. 17:37
반응형

문제

https://school.programmers.co.kr/learn/courses/30/lessons/1844?language=java

(0,0)에 위치한 캐릭터가 (4,4)에 위치한 상대팀 진영에 도착하기 위한 최단거리를 반환하는 문제이다.

캐릭터는 동, 서, 남, 북 방향으로 한칸씩 움직일 수 있으며 이때, 검은색 부분은 캐릭터가 이동할 수 없는 곳이다.

상대방 진영에 도달할 수 없으면 -1을 반환한다.

제한사항

maps는 n*m이며, 각각 1 이상 100 이하이다. (1 = n = m은 주어지지 않음)

maps의 각 요소는 0과 1이며, 0은 이동할 수 없는 부분이다.

캐릭터는 (0,0)이며, 상대방 진영은 (m-1, n-1)이다.

 

풀이

이 문제는 DFS 혹은 BFS의 기본적인 형태의 문제이다.

아래 혹은 오른쪽을 우선으로 탐색하도록 BFS를 구성하여 풀었다.

 

코드

public class Solution {
    public int[][] move = {
            {1,0,-1,0},
            {0,1,0,-1}
    };

    class Space {
        int x;
        int y;
        int cost;
        Space(int x, int y, int cost) {
            this.x = x;
            this.y = y;
            this.cost = cost;
        }
    }
    public int solution(int[][] maps) {
        boolean[][] visitedMap = new boolean[maps.length][maps[0].length];
        Queue<Space> queue = new LinkedList<>();
        Space space = new Space(0,0,1);
        queue.add(space);
        while(!queue.isEmpty() && !isFinish(maps, space)) {
            space = queue.poll();
            for(int i=0; i<4; i++) {
                Space nextSpace = new Space(space.x + move[0][i], space.y + move[1][i], space.cost + 1);
                if(isMovable(maps, visitedMap, nextSpace)) queue.add(nextSpace);
            }
        }
        if(queue.isEmpty() && !isFinish(maps, space)) return -1;
        return space.cost;
    }

    public boolean isMovable(int[][] maps, boolean[][] visited, Space space) {
        try { int temp = maps[space.y][space.x]; } catch (ArrayIndexOutOfBoundsException e) { return false; }
        if(maps[space.y][space.x]==0) return false;
        if(visited[space.y][space.x]) return false;
        visited[space.y][space.x] = true;
        return true;
    }

    public boolean isFinish(int[][] maps, Space space) {
        if(maps.length - 1 == space.y && maps[0].length - 1 == space.x) return true;
        return false;
    }
}
반응형