
머쓱이는 RPG게임을 하고 있습니다. 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.
- [0, 0]은 board의 정 중앙에 위치합니다. 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.
제한사항
function solution(keyinput, board) {
// 최대 좌표 절댓값 구하기
let maxX = Math.floor(board[0]/2);
let maxY = Math.floor(board[1]/2);
// x, y 좌표 값 초기화
let x = 0;
let y = 0;
for (i of keyinput) {
switch(i) {
case 'left':
x--;
x = x < -maxX ? -maxX : x;
break;
case 'right':
x++;
x = x > maxX ? maxX : x;
break
case 'up':
y++;
y = y > maxY ? maxY : y;
break;
case 'down':
y--;
y = y < -maxY ? -maxY : y;
break
}
}
return [x, y]
}
function solution(keyinput, board) {
let res = [0,0];
for (let p of keyinput) {
switch(p){
case 'left': if (-res[0] < board[0]/2-1) res[0]--; break;
case 'right': if (res[0] < board[0]/2-1) res[0]++; break;
case 'up': if (res[1] < board[1]/2-1) res[1]++; break;
case 'down': if (-res[1] < board[1]/2-1) res[1]--; break;
}
}
return res;
}
나와 비슷한 풀이이지만, 조건부 이동을 통해 사용자의 위치가 보드를 넘지 않을 때에만 위치를 업데이트 하도록 했다.
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;
}
객체를 이용한 풀이!!
map(v => key[v])) => 좌표 변화의 배열이 된다. [a[0], b[1])를 그대로 반환하여 이동하지 않는다.a[0] + b[0], a[1] + b[1]을 계산하여 새로운 위치로 업데이트)