꺾이지 않는 마음

[프로그래머스] Lv.0 캐릭터의 좌표 JS 풀이 본문

코딩테스트 기록

[프로그래머스] Lv.0 캐릭터의 좌표 JS 풀이

중요한 것은 2022. 11. 1. 21:25

🧡문제 설명

머쓱이는 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합니다.

✨나의 풀이

function solution(keyinput, board) {
    const nowHere = [0, 0];
    const rowLimit = Math.floor(board[0]/2);
    const colLimit = Math.floor(board[1]/2)
    
    keyinput.forEach(v=>{
        if (v==="right" && nowHere[0] < rowLimit) {
            nowHere[0] += 1;
        } else if (v==="left" && nowHere[0] > -rowLimit) {
            nowHere[0] -= 1;
        } else if (v==="up" && nowHere[1] < colLimit) {
            nowHere[1] += 1;
        } else if (v==="down" && nowHere[1] > -colLimit) {
            nowHere[1] -= 1;
        }    
    })
    
    return nowHere
}

 

내가 있는 위치를 가리킬 변수 nowHere을 선언하고 초기값인 [0, 0]을 할당했다.

가로세로 좌표의 한계값을 담을 변수 rowLimit, colLimit을 선언하고 값을 할당했다.

 

forEach 반복문 속에 if 조건문을 추가하여 각각의 경우에 nowHere의 값을 변경해주었다.

딱히 어려움은 못느낀 문제였다.

 

 

😮다른 풀이

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

 

switch문을 활용한 풀이법이다.

left, right, up, donw 처럼 이렇게 케이스가 딱딱 나누어 떨어지는 경우에는 switch문을 쓰는게 더 코드가 깔끔해 보인다.

나처럼 if else를 남발하면 코드가 너무 길어지기 때문에 앞으로 switch 코드 사용도 고려해봐야겠다.

for문과 if else문 사용에 너무 익숙해져서ㅎㅎ.. 그만 남발하고 다양하게 코드 짜는 연습을 해보자

 

Comments