문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
메모
먼저 캐릭터가 이동할 수 있는 좌표 x, y의 최대 지점(보드의 가로 세로 크기를 절반으로 나눈 뒤 내림한 값)을 구한 뒤, 캐릭터가 이동했을 때 최대 지점을 침범하는지의 여부를 확인하고, 침범하지 않으면 캐릭터를 이동(숫자를 증감)시키는 if문을 짜면 된다.
정답
function solution(keyinput, board) {
let x = 0;
let y = 0;
let row = Math.floor(board[0] / 2);
let col = Math.floor(board[1] / 2);
for (let i = 0; i < keyinput.length; i++) {
if (keyinput[i] === "right" && row >= Math.abs(x + 1)) {
x++;
} else if (keyinput[i] === "left" && row >= Math.abs(x - 1)) {
x--;
}
if (keyinput[i] === "up" && col >= Math.abs(y + 1)) {
y++;
} else if (keyinput[i] === "down" && col >= Math.abs(y - 1)) {
y--;
}
}
return [x, y];
}
function solution(keyinput, board) {
let x = 0;
let y = 0;
let row = Math.floor(board[0] / 2);
let col = Math.floor(board[1] / 2);
for (let i = 0; i < keyinput.length; i++) {
if (keyinput[i] === "left") x--;
else if (keyinput[i] === "right") x++;
else if (keyinput[i] === "up") y++;
else if (keyinput[i] === "down") y--;
x = Math.min(Math.max(x, -row), row);
y = Math.min(Math.max(y, -col), col);
}
return [x, y];
}
function solution(keyinput, board) {
let key = { right: [1, 0], up: [0, 1], down: [0, -1], left: [-1, 0] };
let rslt = keyinput
.map(v => key[v])
.reduce(
(a, b) => {
if (Math.abs(a[0] + b[0]) > board[0] / 2 || Math.abs(a[1] + b[1]) > board[1] / 2) return [a[0], a[1]];
return [a[0] + b[0], a[1] + b[1]];
},
[0, 0]
);
return rslt;
}