문제 설명
머쓱이는 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]까지 이동할 수 있습니다.
제한사항
- board은 [가로 크기, 세로 크기] 형태로 주어집니다.
- board의 가로 크기와 세로 크기는 홀수입니다.
- board의 크기를 벗어난 방향키 입력은 무시합니다.
- 0 ≤ keyinput의 길이 ≤ 50
- 1 ≤ board[0] ≤ 99
- 1 ≤ board[1] ≤ 99
- keyinput은 항상 up, down, left, right만 주어집니다.
풀이
const solution = (keyinput, [boardX, boardY]) => {
let userPosition = {x: 0, y: 0};
const boardRange = {x: Math.trunc(boardX/2), y: Math.trunc(boardY/2)}
keyinput.forEach(direction => {
switch(direction) {
case "up" :
if(boardRange.y < Math.abs(userPosition.y + 1)) break;
userPosition.y += 1;
break;
case "right" :
if(boardRange.x < Math.abs(userPosition.x + 1)) break;
userPosition.x += 1;
break;
case "down" :
if(boardRange.y < Math.abs(userPosition.y - 1)) break;
userPosition.y -= 1;
break;
case "left" :
if(boardRange.x < Math.abs(userPosition.x - 1)) break;
userPosition.x -= 1;
break;
}
})
return [userPosition.x, userPosition.y]
}
음.. 우선 userPosition이라는 객체를 만들어서 각각 x, y를 0으로 해주었다.
그냥 배열로 [0, 0] 해도 되는데 저건 그냥 내 개인 취향.. 뭐 저정도 한다고 성능에 이슈도 없을거 같고.. 아닌가?.
그다음, boardRange라는 객체를 하나 만들었다. board가 정사각형이 아니므로 x축과 y축 각각 갈 수 있는 최대 거리를 알아내어 담아둘 것이다.
고맙게도 board의 가로와 세로는 홀수라는 제한사항이 있으니 간단하게 나누기 2 해주고 소숫점을 버려주자.
마찬가지로 boardRange의 x에는 x로 갈 수 있는 최댓값, y에는 y로 갈 수 있는 최댓값을 넣어주었다.
그다음 입력값에 따라 처리를 해야 하니 주어진 keyinput에 forEach문으로 각각의 방향을 입력받을꺼니까,
switch문을 사용했다.
각각 "해당 방향으로 이동이 가능한지" 를 체크해야 하기 때문에,
아까 지정 해준 boardRange의 값과, 유저의 "현재 위치에 가려고 하는 방향을 더한 값의 절대값"을 비교해서
가려 하는 방향이 더 크다면, break로 끊어주고, 같거나 작다면 userPosition의 해당 방향에 1을 더해주는 식으로 처리했다.
그렇게 forEach 문이 종료 되고 [userPosition.x, userPosition.y]을 리턴해주면 끝.
자주 틀리는 부분은 테스트 케이스 8번,
가려고 하는 방향을 체크하는 부분에서 더한값이나, 더하기 전 값을 체크하는 경우
board의 끝까지 갔다가 되돌아오는 행동이 불가능 해진다.
테스트 케이스 추가하기로
["right", "up", "left", "down"], [3,3] 을 했을때,
결과가 [0,0]이 되는 케이스를 추가해서 테스트 해보면 알 수있다.
https://school.programmers.co.kr/learn/courses/30/lessons/120861#