문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정답
function solution(park, routes) {
// S의 현재 좌표를 확인한다
// 공원의 영역을 벗어나지 않고 이동 경로에 장애물이 없는 경우:
// routes에 따라 S의 좌표를 옮긴다
let sPosition = undefined;
const park2 = park.map(item => {
return item.split("");
});
const routes2 = routes.map(item => {
const tmp = item.split(" ");
return [tmp[0], Number(tmp[1])];
});
for (let i = 0; i < park2.length; i++) {
for (let j = 0; j < park2[i].length; j++) {
if (park2[i][j] === "S") {
sPosition = [i, j];
break;
}
}
}
for (let i = 0; i < routes2.length; i++) {
const direction = routes2[i][0];
const steps = routes2[i][1];
let go = undefined;
// 방향에 따라 목표 지점에 해당하는 좌표를 x, y로 표시한다
// park2[x]가 undefined인 경우:
// 공원의 영역을 벗어남 ===> 이동 x, 반복문에서 빠져나옴
// 다음으로 이동할 칸인 park2[x][y]를 nextPosition으로 설정한다
// nextPosition이 undefined인 경우:
// 공원의 영역을 벗어남 ===> 이동 x, 반복문에서 빠져나옴
// nextPosition이 X인 경우:
// 이동 경로에 장애물이 있음 ===> 이동 x, 반복문에서 빠져나옴
// 두 경우에 해당하지 않는 경우:
// 이동 o ===> go = true
for (let j = 1; j < routes2[i][1] + 1; j++) {
let x, y;
if (direction === "E") {
x = sPosition[0];
y = sPosition[1] + j;
} else if (direction === "W") {
x = sPosition[0];
y = sPosition[1] - j;
} else if (direction === "S") {
x = sPosition[0] + j;
y = sPosition[1];
} else if (direction === "N") {
x = sPosition[0] - j;
y = sPosition[1];
}
if (park2[x]) {
const nextPosition = park2[x][y];
if (nextPosition && nextPosition !== "X") {
go = true;
} else {
go = false;
break;
}
} else {
go = false;
break;
}
}
// 이동이 가능한 경우:
// 이동 방향 및 거리에 따라 sPosition의 좌표를 움직인다
if (go) {
if (direction === "E") {
sPosition[1] += steps;
} else if (direction === "W") {
sPosition[1] -= steps;
} else if (direction === "S") {
sPosition[0] += steps;
} else if (direction === "N") {
sPosition[0] -= steps;
}
}
}
return sPosition;
}