[코딩테스트] 캐릭터의 좌표

windowook·2023년 12월 19일
post-thumbnail

🌱 프로그래머스 문제 풀이

10월부터 알고리즘 공부 및 코딩테스트 준비를 위해서 프로그래머스의 문제를 풀고 있습니다.
Lv 0부터 풀고 있는 중이고 당연히 JavaScript를 이용해서 풀고 있습니다.

🌱 캐릭터의 좌표

문제

머쓱이는 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 함수를 완성해주세요.

ex) [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만 주어집니다.

나의 풀이

function solution(keyinput, board) {
    const width = board[0];
    const height = board[1];
    
    let x = 0;
    let y = 0;

    const keys = { 'left': [-1, 0], 'right': [1, 0], 'up': [0, 1], 'down': [0, -1] };

    for (let i = 0; i < keyinput.length; i++) {
        const key = keyinput[i];
        const direction = keys[key];

        if (direction) {
            const newX = x + direction[0];
            const newY = y + direction[1];

            if (newX >= -width / 2 && newX <= width / 2 && newY >= -height / 2 && newY <= height / 2) {
                x = newX;
                y = newY;
            }
        }
    }

    return [x, y];
}

로직 설명
처음에는 이 코드와 조금 다르게 width와 height에 2로 나눈 뒤 미리 Math.abs를 이용해서
후에 keys의 값들과 비교하는 식으로 짰는데, 테스트 케이스 11개 중 테스트 8만 계속 통과하지 못했습니다.
무엇이 잘못인지 고민하면서 Math.floor를 이용하거나 for 반복문 안에서 left, right, up, down 상황일 때
x나 y에 각각 더해지는 방식으로 고쳐봤지만 결과는 같았습니다.

결국 챗GPT의 도움을 받아 리팩터링을 했는데 처음부터 width와 height를 건드릴 필요없이
반복문 안에서 width 길이 내의 x, height 길이 내의 y를 좌표로 반환하면 된다는
아이디어를 얻게 됐습니다.

그리하여 for 반복문 안에서 key에 keyinput 배열의 i번째 값들을 할당하면서
direction에는 keys 객체안의 key번째 값들을 할당해주고, 이를 이용하여 newX, newY를 구한
다음 각 가로 세로 길이 내에서 제한 조건에 맞을 때 x, y에 동일하게 넘겨주는 것으로 코드를 완성했습니다.
그렇게 리턴한 [x, y]는 테스트 8도 무사히 통과했고 문제 풀이를 제출할 수 있었습니다.

profile
안녕하세요

0개의 댓글