Post

(프로그래머스 Lv.1) 크레인 인형 뽑기 / with.Stack

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

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def solution(board, moves):
    ans = []
    removed = 0
    
    for a in moves:
        col = a - 1 
        for row in range(len(board)):
            if board[row][col] != 0:
                if ans and ans[-1] == board[row][col]:
                    ans.pop()
                    removed += 2 
                else:
                    ans.append(board[row][col])
                board[row][col] = 0
                break
         
    return removed

풀이

  1. 파이썬에서 이중리스트를 돌 때는 행 방향으로 돈다. 근데 인형 뽑기는 열 방향으로 탐색해야된다. => 고로 한 열을 콕 찝어서 반복문을 돌리는데, 해당 행렬의 원소가 0이 아니면 그 값을 바구니(ans)에 추가해주면 된다.
  2. moves의 원소를 하나씩 빼내기 위해 반복문을 돈다. (cf. -1을 하는 이유는 moves가 1부터 주어지는데 리스트의 인덱스는 0부터 시작하기 때문이다.)
    1. 열은 고정되어있으니 행만 board의 길이만큼 반복문을 돌게 되면, 열에 있는 모든 값을 탐색하는 꼴이 된다. 따라서 board의 길이만큼 반복문을 돌리는데, 0이 아닌 값을 만날 때까지만(==인형을 만날 때까지) 돌린다. (왜인지는 break 처리에서 설명.)
      1. 만약 현재 크레인으로 뽑으려는 원소가 0이 아니라면,
        1. 콤보 조건을 처리하기 위해 (같은 숫자가 2번 이상 나올 시)
          1. 바구니가 비어있지 않으면서,
          2. 바구니의 가장 상위의 값과 현재 크레인으로 뽑으려는 원소가 동일하다면,
          3. 현재 바구니의 상위에 담긴 값을 pop하고,
          4. removed에 +2를 한다. (콤보값을 출력해주기 위해서다.)
        2. 그리고 콤보가 발생하지 않는 상황이라거나, 바구니에 원소가 비어있다면,
          1. 현재 크레인으로 뽑으려는 값을 바구니에 추가하면 된다.
        3. 혹시 모르니 뽑은 자리의 위치값은 0으로 바꿔준다.
        4. 그 후 break.
          1. 만약 break를 안 걸면, 열에서 가장 상위에 있는 값만 뽑는게 아니라 다른 값들도 뽑아버릴 것이기 때문이다.

자료구조는 Stack이지만.. 내 기준 이 문제는 행렬처리가 중요한듯

alt text

This post is licensed under CC BY 4.0 by the author.