지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.
["방향 거리", "방향 거리" … ]
예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.
주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다
function solution(park, routes) {
var answer = [];
let Sindex; // 시작시 위치
let Eindex; // 끝 위치
const newPark = park.map((park,index) => {
park = park.split('');
if(park.findIndex((park) => park === 'S') !== -1) {
Sindex = [index, park.findIndex((park) => park === 'S')];
}
return park;
});
const newParkLength = newPark.length - 1;
const lastLength = newPark[newParkLength].length - 1;
Eindex = [newParkLength, lastLength];
for(let i = 0; i < routes.length; i++) {
let [go, block] = routes[i].split(' ');
block = Number(block);
// 1. 해당위치에 값이 존재하는지 확인
// 2. 가는 길에 X표시가 있는지 확인
let goCheck = false; // 갈 수 있는지 확인
switch(go) {
case 'N':
for(let i = 1; i <= block; i++) {
if(Sindex[0] - i >= 0) {
if(newPark[Sindex[0] - i][Sindex[1]] &&
newPark[Sindex[0] - i][Sindex[1]] != 'X') {
goCheck = true;
}
else {
goCheck = false;
break;
}
}
else {
goCheck = false;
break;
}
}
console.log(`N : ${goCheck}`);
if(goCheck) {
Sindex[0] -= block;
}
break;
case 'S':
for(let i = 1; i <= block; i++) {
if(Sindex[0] + i <= Eindex[0]) {
if(newPark[Sindex[0] + i][Sindex[1]] &&
newPark[Sindex[0] + i][Sindex[1]] != 'X') {
goCheck = true;
}
else {
goCheck = false;
break;
}
}
else {
goCheck = false;
break;
}
}
console.log(`S : ${goCheck}`);
if(goCheck) {
Sindex[0] += block;
}
break;
case 'W':
for(let i = 1; i <= block; i++) {
if(Sindex[1] - i >= 0 ) {
if(newPark[Sindex[0]][Sindex[1] - i] &&
newPark[Sindex[0]][Sindex[1] - i] != 'X') {
goCheck = true;
}
else {
goCheck = false;
break;
}
}
else {
goCheck = false;
break;
}
}
console.log(`W : ${goCheck}`);
if(goCheck) {
Sindex[1] -= block;
}
break;
case 'E':
for(let i = 1; i <= block; i++) {
if(Sindex[1] + i <= Eindex[1]) {
if(newPark[Sindex[0]][Sindex[1] + i] &&
newPark[Sindex[0]][Sindex[1] + i] != 'X') {
goCheck = true;
}
else {
goCheck = false;
break;
}
}
else {
goCheck = false;
break;
}
}
console.log(`E : ${goCheck}`);
if(goCheck) {
Sindex[1] += block;
}
break;
}
}
return Sindex;
}
풀면서 어려웠던 점은 각 방향마다 다른 작업을 처리해야하는 점과 범위에서 벗어난 것에 대한 처리였다.
newPark[Sindex[0]][Sindex[1] + i]에서 만약 Sindex[1] + i의 값이 범위에 벗어나게 된다면 '0'이 되거나 또는 undefined가 되는 경우가 생겨버렸다.
'0'이 되어버리는 이유는 범위를 벗어났을 때 모종의 처리가 되어버리는 것 같은데 정확한 이유는 찾지 못하였다.
이 문제를 해결하기 위해서 Sindex의 범위를 벗어나지 못하도록 조건문을 걸어줄 필요가 있었고
if(Sindex[1] + i <= Eindex[1])
를 통해서 더이상 같은 문제가 발생하지 않게 하였다.