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