프로그래머스 크레인 인형뽑기 코드 및 해설 (파이썬)

2021. 6. 1. 15:34algorithm

반응형

https://programmers.co.kr/learn/courses/30/lessons/64061

 

코딩테스트 연습 - 크레인 인형뽑기 게임

[[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]] [1,5,3,5,1,2,1,4] 4

programmers.co.kr

 

answer에 인형이 터뜨러져 사라진 횟수를 저장합니다.
입력으로 주어진 board를 전치하여 transposed_board를 만들고, 각 행에 세로줄의 인형들이 올 수 있게 만들었습니다.
move에서 주어진 세로줄에 접근하여 차례로 아래로 내려가며(인덱스를 증가해가며) 인형이 있으면 그 위치의 값을 0으로 만들어 인형이 꺼내졌음을 표시합니다.
그 후 바구니가 비어있거나 바구니의 가장 위(가장 마지막)에 있는 인형이 현재 인형과 다른 경우 바구니에 인형을 넣고(리스트에 추가하고),
바구니의 마지막 인형이 현재 인형과 다른 경우는 인형이 터뜨려져야 하기 때문에 answer를 1 증가시키고, 마지막 인형도 없애줍니다.

해당 세로줄의 끝까지 갔는데 인형이 없는 경우는 아무 변화 없이 다음 move에서 주어진 세로줄에 접근합니다.

한 번 터뜨러질 때 인형 2개가 사라지므로, 모든 moves를 이행한 후 answer에 2를 곱한 값을 반환합니다.

 

 

def nonzero2list(tuples):
    result = []
    for t in tuples:
        if t != 0:
            result.append(t)
    # 위에 있는 인형이 더 끝에 오도록
    return result[::-1]

def solution(board, moves):
    # 터뜨러져 사라진 횟수
    answer = 0
    
    # 각 세로줄의 인형들 
    dolls_per_line = list(map(nonzero2list, zip(*board)))
    
    # 바구니
    basket = []
    for move in moves:
        dolls = dolls_per_line[move-1]
        # 인형이 있는 경우 
        if not dolls:
            continue 

        doll = dolls.pop()

        
        # 바구니가 비어있거나, 마지막으로 쌓인 인형이 현재 인형과 다른 경우 
        if basket == [] or basket[-1] != doll:
            # 바구니에 인형을 넣음 
            basket.append(doll)
        
        # 바구니의 마지막 인형이 현재 인형과 다른 경우 
        else:
            # 터뜨러져 사라진 횟수 + 1 
            answer += 1 
            basket.pop()
    
    # 터트러져 사라진 인형의 개수 = 터뜨러져 사라진 횟수 * 2 
    return answer * 2
반응형