프로그래머스 Lv1. 크레인 인형뽑기 게임

용상윤·2021년 4월 1일
0

문제

2019 카카오 개발자 겨울 인턴쉽
https://programmers.co.kr/learn/courses/30/lessons/64061


접근

  • 행렬, pop()
  1. 예제의 board list를 차례로 나열해보면 행렬의 형태이다.
    board[0] = [0 0 0 0 0],
    board[1] = [0 0 1 0 3],
    board[2] = [0 2 5 0 1],
    board[3] = [4 2 4 4 2],
    board[4] = [3 5 1 3 1] 인데, 이 리스트의 기준을 열로 잡아서 새로운 리스트를 만들 것이다. 이 때 0을 제외한 각 list를 뒤집어서 만든다. (python에서는 numpy를 이용하면 쉽다.)

  2. 만들어진 새로운 new_board는 다음과 같을 것이다.
    [3, 4],
    [5, 2, 2],
    [1, 4, 5, 1],
    [3, 4],
    [1, 2, 1, 3]

  3. 'moves' list 에서 -1을 한 값이 new_board의 인덱스 값이 될 것이다.

  4. 문제 속 게임의 화면처럼 구현을 위해, 인형을 담는 바구니를 나타내는 변수 basket을 생성하고, 그 안에 차례로 숫자를 담는다.

  5. basket의 길이가 1이 넘어가는 시점부터, 맨 뒤 2개의 값이 같다면 pop()로 지워주고, 점수(count)를 2점씩 올린다.
    (최대한 게임 속 화면의 로직처럼 구현을 하기 위해 basket에 담은 후 지웠다.)


코드

python

import numpy as np
def solution(board, moves):
    LEN = len(board)
    board_cols = np.array(board)
    new_board = []
    for i in range(LEN) :
        new_board.append( list(reversed([x for x in board_cols[:,i] if x!=0])) )
    
    count = 0
    basket = []
    for move in moves :
        if len(new_board[move-1]) != 0 :
            basket.append( new_board[move-1].pop() )
            if len(basket) >= 2 :
                if basket[-1] == basket[-2] :
                    basket.pop()
                    basket.pop()
                    count += 2
    return count
    

js

function solution(board, moves) {
    
    const LEN = board.length;
    let newBoard = [];
    let col = [];
    for(let i=0; i<LEN; i++){
        for(let row=0; row<LEN; row++){
            if( [...board][row][i] !== 0 ){
                col.push( [...board][row][i] );
            }
        }
        col.reverse();
        newBoard.push(col);
        col = [];
    }
    
    let count = 0;
    let basket = [];
    
    for(const i in moves){
        if( newBoard[moves[i]-1].length !== 0 ) {
            basket.push( newBoard[moves[i]-1].pop() )
            if( basket.length >= 2 ){
                if (basket[basket.length-1] == basket[basket.length-2]){
                    basket.pop()
                    basket.pop()
                    count += 2
                }
            }
        }
    }
    return count
}
profile
달리는 중!

0개의 댓글