머쓱이는 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 함수를 완성해주세요.
board
의 정 중앙에 위치합니다. 예를 들어 board
의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.board
은 [가로 크기, 세로 크기] 형태로 주어집니다.board
의 가로 크기와 세로 크기는 홀수입니다.board
의 크기를 벗어난 방향키 입력은 무시합니다.keyinput
의 길이 ≤ 50board
[0] ≤ 99board
[1] ≤ 99keyinput
은 항상 up
, down
, left
, right
만 주어집니다.keyinput | board | result |
---|---|---|
["left", "right", "up", "right", "right"] | [11, 11] | [2, 1] |
["down", "down", "down", "down", "down"] | [7, 9] | [0, -4] |
function solution(keyinput, board) {
let x = 0
let y = 0
const xRange = board[0] === 1 ? 0 : (board[0] - 1) / 2
const yRange = board[1] === 1 ? 0 : (board[1] - 1) / 2
let coordinate = [x, y]
for (let i = 0; i < keyinput.length; i++) {
switch (keyinput[i]) {
case 'left':
x -= 1
break
case 'right':
x += 1
break
case 'up':
y += 1
break
case 'down':
y -= 1
break
default:
return
}
if (x < -xRange) x = -xRange
if (x > xRange) x = xRange
if (y > yRange) y = yRange
if (y < -yRange) y = -yRange
}
coordinate = [x, y]
return coordinate
}
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;
}
1차적으로 코드 구현을 완료하고 테스트를 돌렸는데, 테스트 8번에서 통과되지 못했다;; 그래서 여러가지 경우를 고려해서 조건을 바꿔보고 코드의 위치를 바꿔보기도 하다가 답을 볼까하는 유혹에 빠지려고 할 때, 혹시 같은 고민을 하고 있는 사람이 있을까해서 구글링 했더니, 테스트 8번의 케이스에 대해서 누가 힌트를 남겨놓은 부분이 있었다. 그래서 해당 부분을 참고해서 코드 수정해서 해결했다.