본문 바로가기

개발/Algorithm

[프로그래머스] 크레인 인형뽑기 게임(python)

2021년 5월 20일 Algorithm, 프로그래머스, 크레인 인형뽑기 게임

2019년 카카오 개발자 겨울 인턴십 출제 문제

 

TL;DR

  • 스택(Stack)을 활용하여 주어진 문제를 구현할 수 있는지

문제 분석

1. 게임 화면은 "1 x 1"  크기의 칸들로 이루어진 "N x N" 크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 "1 x 1" 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다.
2. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다
3. 만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다
4. 크레인 작동 시 인형이 집어지지 않는 경우는 없으나 만약 인형이 없는 곳에서 크레인을 작동시키는 경우에는 아무런 일도 일어나지 않습니다. 또한 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다고 가정합니다.
5. 게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.

 

- 2 : 문제를 스택을 활용해서 해결해야 한다는 단서를 준다.

- 3 : 문제 해결을 위해 구현해야 하는 내용을 알려준다. 스택의 top과 뽑힌 인형이 같을 경우 스택에서 제거하고 제거한 인형의 개수를 추가해야 한다.

입출력 형태

인형 현황과 크레인이 뽑는 위치가 배열로 주어진다.

 

- board : 인형의 위치를 나타낸다. 0번 인덱스부터 가장 높은 줄의 인형 현황을 의미하고, 가장 마지막 인덱스의 원소는 가장 마지막 줄의 인형 현황을 나타낸다.

- moves : 크레인이 인형을 뽑을 위치를 담고 있는 배열이다. 해당 위치에 있는 인형을 뽑아 바구니에 담게 된다.

풀이

def solution(board, moves):
    answer = 0
    stack = [0]
    for move in moves:
        for b in board:
            if b[move - 1] != 0:
                stack.append(b[move - 1])
                b[move - 1] = 0
                
                if stack[-1] == stack[-2]:
                    stack.pop()
                    stack.pop()
                    answer += 2
                break
	return answer

 

- 인형이 존재할 경우 인형을 뽑아 바구니(이하 `스택, stack`)에 담는다. 뽑은 인형은 다음에 다시 뽑을 수 없으므로 0으로 만들어 비었음을 표현한다.

- 인형을 스택에 넣을 경우, top에는 가장 최근 넣은 인형이, 그 아래에는 지난번에 넣은 인형이 존재하게 된다. 이 때, 인형의 종류가 같다면 문제에서 주어진 조건에 따라 두 인형을 터뜨려 없애야 한다. 제거된 인형의 개수를 증가시킨다.

- -1, -2 인덱스를 조회하는 이유는 파이썬의 리스트에서 append를 할 경우 가장 마지막 인덱스에 추가되기 때문이다.

반응형