
문제설명
- 왔던 길 다시 가면 안됨
- 최소의 수 니까 bfs
- 왔던길 다시 가면 안된다고 했는데 G 를 보면 지나갔던 길을 다시 가는걸 볼수 있다.
- 이 부분을 곰곰히 생각해보니 갔던길을 체크하는게 아닌, D 으로 막혀있는 곳이나 더이상 갈수 없어서 멈춘 곳을 갔던길로 체크하면된다느 것을 알게됨
나의 코드
function solution(board) {
const arr_go= Array.from({length:board.length},()=>new Array(board[0].length).fill(0))
const go_x=[0,0,-1,1];
const go_y=[-1,1,0,0];
let start;
let end ;
for(var i=0; i<board.length; i++){
for(var z=0; z<board[0].length; z++){
if(board[i][z]=='R') start=[i,z]
if(board[i][z]=='G') end=[i,z];
}
}
// 이렇게 시작과 끝을 정해놓음
arr_go[start[0]][start[1]]=1;
let queu=[[ start , 0]];
// 가는거
while(queu.length>0){
// 끝까지 갔을때
let [go,count]=queu.shift();
// 뽑았을때 도착했다면
if(go[0]==end[0] && go[1]==end[1]) return count;
for(var i=0; i<4; i++){
// 가능 방향, 그리고 여기서 D 나올때 까지 쭉간다음 && 끝까지에 도착했다면 멈청야됨
let change_y= go[0]+go_y[i];
let change_x= go[1]+go_x[i];
while(change_y>=0 && change_y< board.length && change_x>=0 && change_x<board[0].length && board[change_y][change_x]!='D' ){
// 방향 한번바꿨을때 갈수 있는 경우라면 계속 가는게 좋다.
change_y+=go_y[i];
change_x+=go_x[i];
}
change_y-=go_y[i];
change_x-=go_x[i]
// D에 부딪히거나. 더이상 갈수 없는 경우일때
if(change_y>=0 && change_y< board.length && change_x>=0 && change_x<board[0].length &&arr_go[change_y][change_x]==0){
// 안갔던 길일때만.
queu.push([[change_y,change_x] ,count+1])
arr_go[change_y][change_x]=1;
// 인 경우에만 간다고 가정.
}
// 이 방향으로 쭉쭉가야되는데
}
}
return -1;
}