[Programmers]-게임 맵 최단거리
문제
위와 같은 문제가 있다고 보자.
1,1 좌표의 캐릭터가 빨간 지점까지 가는 최단거리를 구하면된다.
코드
import java.util.*;
class Solution {
int[] dirX = {0, 0, 1, -1};
int[] dirY = {1, -1, 0, 0};
boolean[][] visited ;
int m,n;
public int solution(int[][] maps) {
int answer = 0;
m = maps[0].length;//가로
n = maps.length;//세로
visited = new boolean[n][m];
answer = bfs(0,0,maps);
return answer;
}
public int bfs(int x, int y, int[][] maps){
Queue<Node> q = new LinkedList<>();
q.offer(new Node(x,y,1));
visited[y][x] = true;
while(!q.isEmpty()){//큐가 비어있을 때 까지
Node node = q.poll();//큐에 담기
if(node.x == m-1 && node.y == n-1)//빨간 지점에 도착하면
return node.cost;
for(int i=0;i<4;i++){//상하좌우 가기위해
int xx = node.x + dirX[i];
int yy = node.y + dirY[i];
if(0<=xx && xx<m && 0<=yy && yy<n){//맵 범위 조건
if(maps[yy][xx]==1 && !visited[yy][xx]){//벽,방문 조건
visited[yy][xx] = true;//방문처리
q.offer(new Node(xx,yy,node.cost+1));//조건 되면 큐에 넣기
}
}
}
}
return -1;//while문 끝나도 도착 못하면
}
public class Node{
int x;
int y;
int cost;
public Node(int x, int y, int cost){//생성자
this.x = x;
this.y = y;
this.cost = cost;
}
}
}
코드 설명
x,y좌표를 같이 큐에 넣고싶었는데 그걸 생각하다가 클래스를 새로만들어 생성해주었다.
나머지는 주석으로 달아주었다.
요약
- 최단거리에는 bfs를 떠올리자.
- 조금더 bfs에 가까워 졌다.