Engineering Note

[KAKAO] 크레인 인형뽑기 게임 본문

Problem Solving/KAKAO

[KAKAO] 크레인 인형뽑기 게임

Software Engineer Kim 2022. 1. 24. 09:47

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/64061

해설

문제의 상황을 요약하면 이렇다. 게임화면은 좌측에 "1 x 1"크기의 칸들로 이루어진 "N x N"크기의 정사각 격자의 인형뽑기함이 있고, 우측에는 바구니가 있다. 인형은 "1 x 1"크기의 칸을 차지하며 아래부터 차곡 차곡 쌓여 있고, 게임사용자가 크레인을 좌우로 이동하여 멈춘 열의 위치에서 가장 위에 있는 인형을 집어올린다. 그리고 집어올린 인형은 바구니의 아래칸부터 순서대로 쌓이게 된다. 이때 같은 모양의 인형 두개가 연속으로 바구니에 쌓이게 되면 인형은 터뜨려지면서 사라진다.

입력값으로는 인형뽑기함의 격자상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터뜨려져 사라진 인형의 개수를 return 하는 solution 함수를 완성해주세요.

board배열에 담긴 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타내는 것이고, 0은 빈칸을 의미한다.

입출력 예가 다음과 같을 때 문제의 입력 예시 설명을 보면 인형의 처음 상태는 문제에 주어진 예시와 같다고 했다.

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

board[0]의 값이 [0,0,0,0,0] 이고 문제의 그림을 보면 가장 위의 행이 인형이 없는 것을 알 수 있다. 즉 인형뽑기합 격자점의 가장 위에 있는 칸들이 board[0]을 의미하는 것을 알 수 있다.

위의 문제의 상황을 코드로 알고리즘을 생각하면 다음과 같다.

1. moves의 값을 하나씩 꺼낸다. 꺼낸 값을 move라고 하자.

2. move열에서 가장 위에 있는 인형을 찾는다. board[i][move] (i는 0부터 n-1까지 증가시키면서 0이 아닌 값을 찾는다.)

3. 0이 아닌 값, 즉 인형이 있을 경우 집어올려 basket 바구니의 가장 위쪽에 넣는다.

4. basket의 가장 위 2개의 인형이 같은 값인지 확인하여 같으면 answer의 값을 2 증가시킨다.

코드

def solution(board, moves):
    answer = 0
    basket = []
    n = len(board)

    for col in moves:
        for row in range(n):
            if board[row][col-1] == 0:
                continue
            else:
                basket.append(board[row][col-1]) 
                board[row][col-1] = 0

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

    return answer

'Problem Solving > KAKAO' 카테고리의 다른 글

[KAKAO] 다트게임  (0) 2022.01.31
Comments