본문 바로가기
기초다지기/JS 코딩테스트

javaScript 좌표 배열 경로 이동

by 김빵그 2023. 11. 1.

문제

up, down, left, right 가 있는 keyinput 배열이 주어지고 각 요소에 따라 이동하는 좌표의 값이 board 값을 넘어가지 않도록 리턴하여라

나의 풀이 

function solution(key, board) {
    const answer = [0, 0];
    for (let i = 0; i < key.length; i++) {
        if (key[i] === "up" && answer[1] < Math.floor(board[1] / 2)) {
            answer[1] += 1;
        } else if (key[i] === "down" && answer[1] > -Math.floor(board[1] / 2)) {
            answer[1] -= 1;
        } else if (key[i] === "left" && answer[0] > -Math.floor(board[0] / 2)) {
            answer[0] -= 1;
        } else if (key[i] === "right" && answer[0] < Math.floor(board[0] / 2)) {
            answer[0] += 1;
        }
    }
    return answer;
}
  • answer 배열을 0,0으로 초기과 한다
  • key 배열을 반복하면서 각 방향 up, down, left, right에 따라 좌표를 이동
  • 조건문을 사용
    • up일시 answer[1]을 증가시키고 down일때 감소시킨다.
  • board 크기를 넘어가면 안되어 board의 크기를 반 줄인후 비교하여 넘치지 않도록 answer[i]에 추가해준다

 

다른 풀이

1. switch 

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

2) reduce

function solution(keyinput, board) {
    let key = {"right" : [1,0], "up" : [0,1], "down" : [0,-1], "left" : [-1,0]};


    let rslt = keyinput.map(v => key[v]).reduce((a,b) => { 
        if (Math.abs(a[0] + b[0]) > board[0]/2 || Math.abs(a[1] + b[1]) > board[1]/2) 
            return [a[0],a[1]] ; 

        return [a[0] + b[0], a[1] + b[1]];}
    , [0,0])


    return rslt;
}
  • key 객체를 사용하여 각 방향 정의
  • keyinput 배열은 map 함수를 사용하여 방향 문자열을 이동 벡터로 변환 
    • reduce응 사용해 합산하고 이동후 좌표를 계산한다
    • if 현재좌표 a에 대해 이동벡터 b를 더한 결과가 보드를 넘어가면 이동을 제한한다. 조건을 만족하면 이동을 제한하고 현재 좌표인 a를 그대로 반환
    • else a에 이동벡터 b를 더해 새로운 좌표를 생성하고 반환