알고리즘
프로그래머스 게임 맵 최단거리 (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;
}
}