본문 바로가기
코딩 문제/프로그래머스 [ JavaScript ]

[ 프로그래머스 / Javascript ] 캐릭터의 좌표

by CODESIGN 2022. 12. 6.

https://school.programmers.co.kr/learn/courses/30/lessons/120861

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제 설명


머쓱이는 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만 주어집니다.

 

 

입출력 예


 

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 합니다.

 

 

나의 풀이


이 문제에서 기억해야 할 것은 좌표가 중간에서 시작한다. 그리고 그 중간의 좌표가 (0,0)이다. 그렇기 때문에 범위를 확인하기 위해 board의 길이에서 나누기 2를 해주었다. 

 

keys에서 left, right, up, down에 따라 이동되는 좌표를 지정해준 뒤, keyinput 배열에서 눌리는 키에 따라 현재 위치인 answer의 x와 y좌표에 앞으로 이동할 곳이 board에서 벗어나지 않는다면 현재 위치에서 값을 더해주었다. 

 

function solution(keyinput, board) {
    var answer = [0,0];
    let keys = {
        left: [-1,0],
        right: [1,0],
        up: [0,1],
        down: [0,-1],
    }
    for (let i = 0; i < keyinput.length; i++) {
        if((answer[0]+keys[keyinput[i]][0] <= Math.floor(board[0]/2)) && 
            (answer[0]+keys[keyinput[i]][0] >= (-1 *Math.floor(board[0]/2))) &&
            (answer[1]+keys[keyinput[i]][1] <= Math.floor(board[1]/2)) &&
            (answer[1]+keys[keyinput[i]][1] >= (-1 *Math.floor(board[1]/2)))
           ) {
            answer[0]+=keys[keyinput[i]][0]
            answer[1]+=keys[keyinput[i]][1]
            }
    }
    return answer;
}

 

 

 

다른 풀이


나의 풀이보다 효율성도 좋고 코드도 간결하다. 나와 풀이는 비슷하지만 여기서는 switch를 사용하여 눌리는 키에 따라 if 문으로 확인하게 했다. 

 

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;
}

 

 

 

댓글