알고리즘

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

박카스마시며코딩 2022. 5. 7. 23:01

https://programmers.co.kr/learn/courses/30/lessons/1844

 

코딩테스트 연습 - 게임 맵 최단거리

[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11 [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1

programmers.co.kr

 

저는 해당 문제를 BFS를 이용해 문제를 해결하였습니다.

저는 개인적으로 변수 변수를 통해 벽이나 빈 곳을 표현하는 것이 가독성 측면에서 조금 더 좋은 것 같습니다.

 

import java.util.*;
class Solution {
    
    private static final int NO_ANSWER = -1;
    private static final int EMPTY = 1;
    private static final int WALL = 0;
    
    public int solution(int[][] maps) {
        int answer = bfs(maps);
        return answer;
    }
    private static final int[] dy = {-1,0,1,0};
    private static final int[] dx = {0,1,0,-1};
    private int bfs(int[][] maps){
        int n = maps.length;
        int m = maps[0].length;
        boolean[][] visited = new boolean[n][m];
        Queue<int[]> q = new LinkedList<>();
        q.offer(new int[]{0,0});
        int time = 1;
        while(!q.isEmpty()){
            int size = q.size();
            for(int s = 0 ; s < size ; s++){
                int[] now = q.poll();
                // System.out.println(time+" "+Arrays.toString(now));
                if(now[0] == n-1 && now[1] == m-1){
                    return time;
                }
                for(int dir = 0 ; dir < 4; dir++){
                    int ny = now[0] + dy[dir];
                    int nx = now[1] + dx[dir];
                    if(checkBound(ny,nx,n,m) && !visited[ny][nx] && maps[ny][nx] == EMPTY){
                        visited[ny][nx] = true;
                        q.offer(new int[] {ny,nx});
                    }
                }
            }
            time++;
        }
        return NO_ANSWER;
    }
    private boolean checkBound(int y ,int x, int n, int m){
        if(y >= 0 && y < n && x >= 0 && x < m){
            return true;
        }   
        return false;
    }
}