코딩 테스트

(Java) 프로그래머스 - 게임 맵 최단거리

로승리 2022. 7. 12. 21:33

문제를 보고 처음에 아주 신이 났었다.

딱히 생각하지 않고 바로 풀 수 있는 BFS문제였기 때문이다.

문제를 제대로 읽지 않고 10분도 안돼서 코드 작성을 마쳤고 테스트를 돌리는데 

몇 개의 케이스를 제외하고서 모두 틀렸고 심지어 런타임 에러도 났다.

30분 넘게 고민을 해도 답이 나오지 않았고

1시간이 다 돼서야 n과 m의 크기가 가변적이라는 걸 발견했다.

문제 예시에서 5X5 배열만을 이야기해서 모든 변수를 5로 고정하고 풀었으니 당연히 틀릴만했던 거다.

저번에도 이런 경우가 꽤 있었는데 오늘은 정말 허탈했다....

문제를 제대로 읽자....


최종 코드

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
    static boolean[][] visited;
    static int[] dx = {0, 0, 1, -1};
    static int[] dy = {1, -1, 0, 0};
    static int n, m;
    
    public int solution(int[][] maps) {
        int answer = 0;

        n = maps.length;
        m = maps[0].length;

        visited = new boolean[n][m];
        answer = bfs(0, 0, maps);
        return answer;
    }
    static int bfs(int x, int y, int[][] maps) {
        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[]{x, y});
        visited[x][y] = true;

        while (!queue.isEmpty()) {
            int[] temp = queue.poll();
            for (int i = 0; i < 4; i++) {
                int nx = temp[0] + dx[i];
                int ny = temp[1] + dy[i];

                if (nx < 0 || ny < 0 || nx >= n || ny >= m) {
                    continue;
                }

                if (!visited[nx][ny] && maps[nx][ny] == 1) {
                    visited[nx][ny] = true;
                    queue.add(new int[]{nx, ny});
                    maps[nx][ny] = maps[temp[0]][temp[1]] + 1;
                }

            }
        }
        if(visited[n-1][m-1]) {
            return maps[n-1][m-1];
        } else {
            return -1;
        }
    }
}