크레인 인형뽑기 게임 문서의 문제 1 풀이 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""크레인 인형뽑기 게임 (프로그래머스 64061) 풀이와 검증."""
import copy
import random
def solution(board, moves):
basket = []
popped = 0
n = len(board)
for m in moves:
col = m - 1
for row in range(n):
doll = board[row][col]
if doll != 0:
board[row][col] = 0
if basket and basket[-1] == doll:
basket.pop()
popped += 2
else:
basket.append(doll)
break
return popped
def by_column_stacks(board, moves):
"""열마다 인형 스택(맨 위가 끝)을 미리 만든다."""
n = len(board)
cols = [[board[r][c] for r in range(n - 1, -1, -1) if board[r][c]] for c in range(n)]
basket, popped = [], 0
for m in moves:
if cols[m - 1]:
doll = cols[m - 1].pop()
if basket and basket[-1] == doll:
basket.pop()
popped += 2
else:
basket.append(doll)
return popped
def picks(board, moves):
b = copy.deepcopy(board)
out = []
for m in moves:
for row in range(len(b)):
if b[row][m - 1]:
out.append(b[row][m - 1])
b[row][m - 1] = 0
break
else:
out.append(None)
return out
if __name__ == "__main__":
ex = [[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]]
mv = [1, 5, 3, 5, 1, 2, 1, 4]
assert picks(ex, mv) == [4, 3, 1, 1, 3, 2, None, 4] # 6단계 표
assert solution(copy.deepcopy(ex), mv) == 4
assert solution([[0, 0, 0], [0, 1, 0], [2, 1, 3]], [2, 2, 1, 3]) == 2
rng = random.Random(64061)
for _ in range(2000):
n = rng.randint(1, 6)
board = [[0] * n for _ in range(n)]
for c in range(n):
h = rng.randint(0, n)
for r in range(n - h, n):
board[r][c] = rng.randint(1, 3)
moves = [rng.randint(1, n) for _ in range(rng.randint(1, 15))]
assert solution(copy.deepcopy(board), moves) == by_column_stacks(board, moves)
print("ALL CHECKS PASSED")