[Python] 크레인 인형 뽑기 게임
코딩테스트 합격자되기 파이썬 편- 문제 13
문제 > https://school.programmers.co.kr/learn/courses/30/lessons/64061?language=python3
✅ 문제 접근
크레인이 board 번호를 따라 움직이는 moves 배열로 바구니에 인형을 밑부터 차곡차곡 쌓아올려야 한다.
연속해서 두 개의 같은 인형이 바구니에 쌓였을 때 맨 위의 두 인형은 모두 사라져야 한다.
- 스택 이용
주어진 board 배열에서 0이 빈 칸임을 고려하여 격자 구성을 생각해야 한다.
주어진 board 배열을 바구니에 즉시 담을 수 있는 리스트(스택)로 구성해야 한다.
- board 배열을 순회하면서 값이 0이 아니라면 1. 행과 열을 바꾸고 2. 바뀐 열에서의 값을 격자 크기 N-1에서 빼야 한다. (배열과 격자의 행과 열이 서로 바뀌어 있고, 스택의 특성 상 맨 위의 값이 리스트의 마지막에 와야 하기 때문)
✅ 기능
Board 배열을 스택으로 구성하기: def stackList()
구성한 스택으로 moves 배열에 따라 바구니에 인형을 넣기
연속으로 같은 인형이 들어오면 두 번 pop 하고 사라진 인형의 개수(answer)를 2 더해주기: def solution()
✅ 구현
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
def stackList(board):
N = len(board[0])
stackList = [[0 for _ in range(N)] for _ in range(N)]
for i in range(N):
for j in range(N):
if board[i][j] != 0:
stackList[j][N - 1 - i] = board[i][j]
else:
stackList[j].pop(N - 1 - i)
return stackList
def solution(board, moves):
answer=0
stack= stackList(board)
blanket=[]
for i in moves:
# 인형 넣기
if stack[i-1]:
new= stack[i-1].pop()
blanket.append(new)
if len(blanket)>=2 and blanket[-2]==new:
blanket.pop()
blanket.pop()
answer+=2
return answer
✅ 회고
: 내가 구현한 코드는 board 배열을 스택으로 재구성하여서 바구니에 넣었다.
하지만, 가장 좋아요를 많이 받은 다른 사람의 코드는 빈 stackList를 만들어 바로 바구니에 인형을 넣어 사라진 인형의 개수를 셌다. 굳이 2번에 걸쳐서 하지 않고 board 자체를 스택으로 여겨 바로 답을 구현하는 깔끔한 코드인 것 같다 !
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def solution(board, moves):
stacklist = []
answer = 0
for i in moves:
for j in range(len(board)):
if board[j][i-1] != 0:
stacklist.append(board[j][i-1])
board[j][i-1] = 0
if len(stacklist) > 1:
if stacklist[-1] == stacklist[-2]:
stacklist.pop()
stacklist.pop()
answer += 2
break
return answer
This post is licensed under CC BY 4.0 by the author.