문제(출처: 프로그래머스)

머쓱이는 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]까지 이동할 수 있습니다.

 

▶ 내가 푼 방식

function solution(keyinput, board) {
    var answer = [];
    const controlXY = {"down": ["y", -1] , "up": ["y", 1], "left": ["x", -1], "right": ["x",1] }
    const maxX = (board[0] - 1) / 2;
    const maxY = (board[1] - 1) / 2;
    let x = 0
    let y = 0
    for (let i of keyinput){
        let [coordinate, value] = controlXY[i];
        if (coordinate == "x"){
            x += value
            if (x > maxX) {x = maxX}
            if (x < -maxX) {x = -maxX}
        }
        else{
            y += value
            if (y > maxY) {y = maxY}
            if (y < -maxY) {y = -maxY}
        }
    }
    return [x, y]
}

 

 다른 유저가 푼 방식

// 유저 1
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
const CONTROL = {
    up: [0, 1],
    down: [0, -1],
    left: [-1, 0],
    right: [1, 0],
}

function solution(key, [n, m]) {
    const [x1, x2] = [-(n-1)/2, (n-1)/2];
    const [y1, y2] = [-(m-1)/2, (m-1)/2];
    return key.reduce(([x, y], k) => {
        const [nx, ny] = [x + CONTROL[k][0], y + CONTROL[k][1]];
        if (x1 <= nx && nx <= x2 && y1 <= ny && ny <= y2) return [nx, ny];
        return [x, y];
    }, [0, 0]);
}


// 유저 3

 

 배운 것들

     -  배운것 : Array.reduce 에서 accumulator 를 배열로도 가능하다. 함수 안에서 더하기만 하는 것이 아니라 원하는 기능을 구현 할 수도 있다.

     -  복습 : Array.reduce

array.recude((accumulator, currentVale) => {
    accumulator + currentValue
  },
  initialValue
);

     - 

+ Recent posts