[프로그래머스] 크레인 인형뽑기 게임 풀이 _ 2019 카카오 개발자 겨울 인턴십



1. 문제

https://programmers.co.kr/learn/courses/30/lessons/64061?language=python3

2. 풀이 방법

  • 각 컬럼의 가장 위에 있는 요소 배열을 생성하고 갱신합니다.
  • 제거해야 할 컬럼의 위치에 맞춰서 최상위 요소를 뽑아냅니다. 뽑아낸 요소와 뺀 요소들의 배열의 상단에 있는 요소들을 비교하여 같으면 제거합니다.

3. 소스코드

3.1. 내가 푼 소스코드

answer = 0

def delete_element(ans_stack):
    global answer 
    cnt = 1
    for i in range(len(ans_stack)-2, -1, -1):
        if ans_stack[i] == ans_stack[-1]:
            cnt += 1
        else :
            break
    if cnt > 1 :
        for i in range(cnt):
            ans_stack.pop()
            answer += 1
        

def solution(board, moves): 
    ans_stack = []
    arr_idx = [ -1 ] * len(board)
    # 각 컬럼의 가장 위에 있는 요소 배열 -> arr_idx 갱신
    for row_idx in range(len(board)):
        for col_idx in range(len(board)):
            if arr_idx[col_idx] != -1 :
                continue
            if board[row_idx][col_idx] != 0:
                arr_idx[col_idx] = len(board) - row_idx - 1
            
    for move in moves:
        # 요소 없으면 건너 뛰기
        if arr_idx[move-1] == -1:
            continue
        
        ans_stack.append(board[(len(board) - 1) - (arr_idx[move-1])][move - 1]) 
        arr_idx[move-1] -= 1
        
        delete_element(ans_stack) 
    
    return answer

3.2. 숏코딩 by programmers

  • 위의 풀이와 다르게 뺀 인형 stack의 최상단에서 바로 아래 있는 요소만 체크하면 됩니다.
  • 컬럼마다 최상위 요소가 어디 있는지 필요한 별도의 배열을 생성하지 않습니다.
def solution(board, moves):
    stacklist = []
    answer = 0

    for i in moves:
        for j in range(len(board)):
            if board[j][i-1] != 0:
                stacklist.append(board[j][i-1])
                board[j][i-1] = 0

                if len(stacklist) > 1:
                    if stacklist[-1] == stacklist[-2]:
                        stacklist.pop(-1)
                        stacklist.pop(-1)
                        answer += 2     
                break

    return answer