문제 링크

풀이 방법

스택을 이용한 전형적인 문제이다. moves 배열에서 인형뽑기를 할 각 열을 꺼내주고,

board의 해당 칸이 0보다 크면(=인형이 있으면) 그 인형을 뽑는다.

스택에 넣어주기 전, 스택의 top을 검사하여 뽑은 인형과 top이 같으면 인형 수를 2 증가시킨다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from collections import deque

def solution(board, moves):
answer = 0
moves = deque([move-1 for move in moves])
stack = []

while moves:
found = False
j = moves.popleft()

for i in range(len(board)):
if board[i][j] > 0:
found=True
curr = board[i][j]
board[i][j] = 0
break


if stack and found:
top = stack.pop()
if curr == top:
answer+=2
else:
stack.append(top)
stack.append(curr)
else:
stack.append(curr)

return answer

배운 점

파이썬의 변수 스코프에 대해서 헷갈려서 자꾸 에러가 났었다.

curr 변수가 루프를 돌면서 계속 살아있어서 만약 해당 칸에 인형이 없다고해도(=0) 전에 선택한 인형의 값이 남아있었다.

파이썬의 경우, 블록 스코프를 가지고 있는 다른 언어(C, Javascript…)와 다르게 함수 스코프이고,

오직 글로벌 변수로컬 변수밖에 존재하지 않는다.

이 기회를 통해서 다시 한번 파이썬의 변수 스코프에 대해 알게 되었다.

참고 링크

파이썬 변수 스코프에 관해서 - https://soooprmx.com/archives/5854