문제
문제풀이
일단 요 문제를 풀기위해서는 MAP을 그려줘야겠다~! 생각을 했습니다.
그래서 테두리 부분은 true, 안 부분은 false 이런식으로 해주어야겠다~~
싶었지만 생각해보니 우리는 테두리로만 탐색을 해야하기 때문에 테두리, 테두리 안, 테두리 밖 이렇게 3가지 경우로 구분해서 생각해주어야 합니다. 따라서 테두리는 1, 테두리 안 2, 테두리 밖은 0으로 설정해주었습니다.
테두리 인건 어케 아냐고요? rectangle 에서 점이 두 개가 주어지죠?
(x1,y1) (x2,y2)
x는 x1 혹은 x2 일때 , y는 y1 혹은 y2 일때 테두리겠죵??
그리고 여기서 원하는것은 바로바로바로바로~~~!!!
최단거리!!!
입니다.
고말인 즉슨 우리는 BFS 를 써줘야 한다는 것이져.. 후후후후후후후후후후후
아근데 제가 잘못했던 점이 바로 좌표에 *2를 안 해줬다는 겁니다.
그림에서 초록동그라미 부분 보시믄 사실 쟤네는 떨어져 있지만 내가 배열로써 저 친구를 찍게 되면 1 1 이렇게 붙어있답니다.
그래서 저걸 구분지어 주기 위해서 모든 좌표에 곱하기 2를 꼭꼭 해줘야 결과가 나옵니다.. 글고 물론 결과값을 낼때는 나누기 2를 해줘야겠죠잉???
코드
function solution(rectangle, characterX, characterY, itemX, itemY) {
//좌표에 2곱해주기
characterX *=2;
characterY *=2;
itemX*=2;
itemY*=2;
let doubleRec = rectangle.map(rec => rec.map (point => point*2));
//이동좌표 설정해주기
const dx=[0,0,-1,1];
const dy=[-1,1,0,0];
//map 그려주기
let map = Array.from({length:103},() => Array(103).fill(0));
doubleRec.forEach(([x1,y1,x2,y2])=>{
for(let i=x1;i<=x2;i++){
for(let j=y1;j<=y2;j++){
if(i === x1 || i === x2 || j === y1 || j === y2){
if(map[i][j]===0){map[i][j]=1;}
}
else{map[i][j]=2;}
}
}
});
//큐를 생성하고 시작점을 설정해줍니다.
let start=[characterX,characterY,0]; // 마지막은 카운트값
let queue = [start];
//시작점을 탐색하면 안되므로 0으로 설정해준다.
map[characterX][characterY]=0;
//BFS 탐색을 시작한다.
while(queue.length > 0){
let [x,y,cnt]=queue.shift();
if(x === itemX && y === itemY){ return cnt/2; }
for(let d=0;d<4;d++){
let nx=x+dx[d];
let ny=y+dy[d];
if(map[nx][ny]===1){
queue.push([nx,ny,cnt+1]);
map[nx][ny]=0;
}
}
}
return 0;
}
잡담
요 부분을 고려하지 못하고 true, false로 테두리를 구분지으려 했었던것이 계속 틀리던...문제의 경우였다!!!!!!!!!!!
그래서 직접 map을 다 찍어보고 나서야... 아 테두리, 안, 밖 다 구분해줘야 되는구나..하구 알았다...
그래서 앞으로는 예외에 대한 부분을 좀 더 냉!철!하고 꼼!꼼!하게 보도록 해야겠다~~~