n*n 배열을 주고 시작지점에서 routes 에 따라 움직이는 알고리즘인데 하나 주의할 점이 있다면 갈 수 있는 곳이 있고 갈 수 없는 곳이 있다.
편의를 위해 n*n 만들 때, 각각의 item 들은 x, y 좌표와 v 를 가지는 Object 로 배열을 재구성했고,
routes 에 따라 움직이면서 user 의 좌표를 이동시켜주게끔 로직을 작성했다.
function solution(park, routes) {
let user = {x: null, y: null};
const rePark =
park.map((parkPart, y) => parkPart.split('').map((parkPartValue, x) => {
if(parkPartValue === 'S') {
user.x = x; user.y = y;
}
return {y, x, v: parkPartValue};
}));
routes.forEach(route => {
const [op, n] = route.split(' ');
const tempUser = {...user};
let hasBlock = false;
Array.from({length: n}, (_, index) => {
switch(op) {
case 'N':
tempUser.y -= 1;
break;
case 'S':
tempUser.y += 1;
break;
case 'W':
tempUser.x -= 1;
break;
case 'E':
tempUser.x += 1;
break;
}
const movedPosition = rePark[tempUser.y]?.[tempUser.x] ?? null;
if(!movedPosition) {
hasBlock = true;
return;
}
if(movedPosition.v === 'X') {
hasBlock = true;
return;
}
});
if(!hasBlock) {
user = {...tempUser};
}
});
return [user.y, user.x];
}
처음 잘못 생각했던 부분이 있었다.
routes 에 따라 움직이는 길 중 하나라도 못 가는 길이 있으면 해당 route 를 무시해야 하는 조건이 있었는데, 이를 한칸씩 움직이면서 못 가는 칸인지 확인하지 않고 한 번에 이동한 후, 해당 칸이 못 가는 칸인지 확인을 해서 테스트 케이스를 실패했다
다른 사람들이 푼 로직을 살펴보긴 했는데 분기문 및 로직이 생각보다 눈에 안들어와서 시간을 두고 천천히 다시 살펴봐야겠다.
재미있는 부분이 있었다면 각 방향을 switch 문으로 풀었던 부분을 다른 사람들은 미리 Object 로 정의해두고 가져다 쓰는 부분이 좀 더 가독성이 좋아보였다.
const OP_MAP = {
N : [0, -1],
S : [0, +1],
W : [-1, 0],
E : [+1, 0],
}