2019 카카오 개발자 겨울 인턴쉽
https://programmers.co.kr/learn/courses/30/lessons/64061
예제의 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를 이용하면 쉽다.)
만들어진 새로운 new_board는 다음과 같을 것이다.
[3, 4],
[5, 2, 2],
[1, 4, 5, 1],
[3, 4],
[1, 2, 1, 3]
'moves' list 에서 -1을 한 값이 new_board의 인덱스 값이 될 것이다.
문제 속 게임의 화면처럼 구현을 위해, 인형을 담는 바구니를 나타내는 변수 basket을 생성하고, 그 안에 차례로 숫자를 담는다.
basket의 길이가 1이 넘어가는 시점부터, 맨 뒤 2개의 값이 같다면 pop()로 지워주고, 점수(count)를 2점씩 올린다.
(최대한 게임 속 화면의 로직처럼 구현을 하기 위해 basket에 담은 후 지웠다.)
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
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
}