크레인 인형 뽑기 게임

Eunsoo Ha·2021년 7월 12일
0

programmers

목록 보기
1/37

문제이해

2차원 배열 board를 탐색하는 문제입니다.
board 배열을 게임 화면처럼 N x N 크기의 정사각 격자 형태로 만들어 보면
다음과 같은 모양이 됩니다.

board = [
  [0,0,0,0,0]
  [0,0,1,0,3]
  [0,2,5,0,1]
  [4,2,4,4,2]
  [3,5,1,3,1]
  ]

moves 배열을 통해 board의 각 원소인 배열 중 몇 번째 원소에 접근해야 할 지 알 수 있습니다.
moves의 0번 째 원소를 N이라고 한다면, board안의 각 배열 N번 째 에서 0을 제외한 마지막 원소에 접근하여 basket배열로 값을 넣어주면 됩니다.
basket 배열에 순서대로 쌓인 원소가 연속으로 2개가 같을 경우 두 원소를 모두 제거합니다.
그리고 문제의 기댓값인 사라진 인형의 개수를 result라는 변수를 만들어 +2를 해줍니다.


수도 코드

  1. 뽑은 인형을 담는 바구니 역할을 하는 배열 basket을 만듭니다.
  2. basket에 연속해서 쌓여 사라진 인형의 수를 기록하는 result 변수를 만듭니다.
  3. moves 배열의 0번 째 원소의 값을 가지고 board 배열을 반복문으로 순회하면서 0이 아닌 값을 찾으면 basket에 담습니다.
  4. basket의 원소가 연속으로 같은 경우 두 원소를 제거하며 result에 2를 더합니다.
  5. moves 배열을 모두 순회하였다면 사라진 인형의 개수 result를 리턴합니다.

코드

  • 답 1
function solution(board, moves) {
    const basket = [];
    let result = 0;
    moves.forEach(order => {
        const doll = pickup(board, order-1);
        if(doll){
            if(basket[basket.length-1] === doll){
                basket.pop();
                result +=2;
            }else{
                basket.push(doll);
            }
        }
    });
    return result;
}

function pickup(board, order){
    for(let i = 0; i < board.length ; i++){
        if(board[i][order] !== 0){
            const doll = board[i][order];
            board[i][order]= 0;
            return doll;
        }
    }
}
  • 답 2
function solution(board, moves) {
    let answer = 0;
    let count = moves.length; // 움직일 횟수
    let col = board.length; // 현재 board의 col수
    let bascket = []; // 뽑은 인형 쌓는 바구니
    let lastItem = 0; // 바구니의 마지막 인덱스

    for (let i = 0; i < count; i++) {
        let selected = moves[i] - 1; // 선택되어진 열
        let pick = 0; // 뽑은 인형

        // 해당 열에서 가져올 인형 (0은 인형없는 빈칸)
        for (let j = 0; j < col; j++) {
            if (board[j][selected] !== 0) { // 뽑힌 인형 
                pick = board[j][selected];
                lastItem = bascket.length - 1; // 바구니의 맨 위 인형

                if (pick === bascket[lastItem]) { // 뽑힌 인형 = 바구니의 맨 위 인형
                    bascket.pop(); // 바구니 마지막 인형 제거
                    answer += 2; // 점수 추가
                } else {
                    bascket.push(pick); // 바구니 맨 위로 추가
                }
                board[j][selected] = 0; // 선택 된 인형위치는 빈칸
                break; // 해당 루프에서 벗어나기
            }
        }
    }

    return answer;
}

0개의 댓글