프로그래머스에서 코딩테스트 JS 유연성을 키우기 위해 문제를 풀어보았습니다.
문제설명
머쓱이는 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]까지 이동할 수 있습니다.
입출력 예
keyinput | board | result |
["left", "right", "up", "right", "right"] | [11, 11] | [2, 1] |
["down", "down", "down", "down", "down"] | [7, 9] | [0, -4] |
입출력 예 설명 #1
- [0, 0]에서 왼쪽으로 한 칸 오른쪽으로 한 칸 위로 한 칸 오른쪽으로 두 칸 이동한 좌표는 [2, 1]입니다.
입출력 예 설명 #2
- [0, 0]에서 아래로 다섯 칸 이동한 좌표는 [0, -5]이지만 맵의 세로 크기가 9이므로 아래로는 네 칸을 넘어서 이동할 수 없습니다. 따라서 [0, -4]를 return합니다.
저의 답변
function solution(keyinput, board) {
var answer = [];
const minRIdx = -Math.floor(board[0]/2), maxRIdx = Math.floor(board[0]/2)
const minCIdx = -Math.floor(board[1]/2), maxCIdx = Math.floor(board[1]/2)
let x = 0;
let y = 0;
for(let i = 0; i < keyinput.length; i++){
if(keyinput[i] === "left" && x > minRIdx){
x -= 1
}else if(keyinput[i] === "right" && x < maxRIdx){
x += 1
}else if(keyinput[i] === "up" && y < maxCIdx){
y += 1
}else if(keyinput[i] === "down" && y > minCIdx){
y -= 1
}
}
return [x,y];
}
x,y가 정중앙 0으로 시작하고 board값 절반으로 나누었다
for문안에 if문으로 left, right, up, down 조건과 만약 방향이 절반으로 나누는 값보다 넘어서 이동 하게 되면 절반 최소 또는 최댓값을 주기 위해서 같이 조건을 걸어났다.