https://school.programmers.co.kr/learn/courses/30/lessons/172928
function solution(park, routes) {
const start = [0, 0];
const board = park.map((v, i)=> {
[...v].forEach((w, j)=> {
if (w === "S") {
[start[0], start[1]] = [i, j];
}
})
return [...v]
})
routes.forEach((v)=>{
const [op, n] = v.split(" ");
let flag = false;
if (op === "E") {
if (start[1] + +n < board[0].length) {
for (let i = 1; i <= +n; i++) {
if (board[start[0]][start[1] + i] === "X") {
flag = true;
}
}
start[1] += flag ? 0 : +n;
}
}
if (op === "W") {
if (start[1] - +n >= 0) {
for (let i = +n; i >= 0 ; i--) {
if (board[start[0]][start[1] - i] === "X") {
flag = true;
}
}
start[1] -= flag ? 0 : +n;
}
}
if (op === "N") {
if (start[0] - +n >= 0) {
for (let i = +n; i >= 0 ; i--) {
if (board[start[0] - i][start[1]] === "X") {
flag = true;
}
}
start[0] -= flag ? 0 : +n;
}
}
if (op === "S") {
if (start[0] + +n < board.length) {
for (let i = 1; i <= +n; i++) {
if (board[start[0] + i][start[1]] === "X") {
flag = true;
}
}
start[0] += flag ? 0 : +n;
}
}
})
return start;
}
park
를 순회하며 시작점을 찾은 후, routes
를 순회하면서 조건에 맞는 좌표를 찾았다. 조건문과 반복문을 범벅하며 다소 더럽게 하드 코딩했다.
제일 고민했던 부분은 방향과 거리 내에 있는 장애물을 어떻게 판단할 것인가였다. 그래서 생각해낸 것이 조건문 진입 전 flag
를 세우고, 각 조건을 통과하면 n
만큼 좌표를 순회해 X
가 있다면 flag
를 변경하는 것이었다. flag
가 변경되면 장애물이 있으므로 좌표에 0
을 더했다.
통과한 코드이긴 하지만, 너무 복잡하고 더러워서 다시 살펴보며 중복되는 부분을 제거하려고 시도했다.
function solution(park, routes) {
const start = [0, 0], direction = {"N":[-1, 0], "S":[1, 0], "W":[0, -1], "E":[0, 1]};
park.forEach((v, i)=> {
[...v].forEach((w, j)=> {
if (w === "S") {
[start[0], start[1]] = [i, j];
}
})
})
routes.forEach((v)=>{
const [op, n] = v.split(" ");
let nx = start[0], ny = start[1], cnt = 0;
while (cnt < +n) {
nx += direction[op][0];
ny += direction[op][1];
if (!park[nx] || !park[nx][ny] || park[nx][ny] === "X") break;
cnt++;
}
if (cnt === +n) [start[0], start[1]] = [nx, ny];
})
return start;
}
조건문으로 하나씩 계산하는 대신 방향에 대한 hash map
을 만들어 계산식을 줄였다. 쓰잘데기 없는 board
배열 변수도 제거했다.
routes
를 순회하면서 nx, ny
에 direction
에 따른 좌표값을 계산했다. flag
대신 cnt
를 변수로 놓고, while
문을 돌려 n
만큼 거리 내 장애물이 있는지 찾았다. while
안의 다른 조건은 인덱스가 배열 길이를 벗어났을 때 undefined
를 반환하는 JS
성일을 이용해 범위를 벗어났는지 확인하는 것이다. nx < 0 && ny < 0 && ...
등으로 썼다가 다른 사람 풀이를 참고해 수정했다.
마지막으로 cnt
가 n
과 같다면, 범위 안쪽이면서 장애물을 만나지 않은 것이므로, 좌표를 nx, ny
로 수정했다.
hash map
이 유용하다. 익숙해지자.