[프로그래머스 Level 1] 크레인 인형뽑기 / 2019 카카오 개발자 겨울 인턴십 / 파이썬
<문제>
https://programmers.co.kr/learn/courses/30/lessons/64061
코딩테스트 연습 - 크레인 인형뽑기 게임
[[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]] [1,5,3,5,1,2,1,4] 4
programmers.co.kr
문제가 상당히 길어서 링크로 대체.
<풀이>
def solution(board, moves):
##1
answer = 0
line = {}
box = []
## 2
for i in range(len(board)):
line[i+1] = []
for i in board[::-1]:
for j in range(len(i)):
if i[j] != 0:
line[j+1].append(i[j])
# print(line)
# print(moves)
## 3
for i in moves:
# print('Morning', box)
if len(line[i]) > 0:
pick = line[i].pop()
box.append(pick)
# print('Lunch', box)
if len(box) > 1:
if box[-1] == box[-2]:
box.pop()
box.pop()
answer += 2
else:
pass
# print('Dinner', box)
print(answer)
return answer
코드 설명:
##1 : 다른 풀이 방법들도 있겠지만 개인적으로 board로 주어진 list를 그대로 다루면 좀 헷갈릴 것 같아서 처음부터 세로줄마다 dictionary를 만드는 방법을 택했다. box는 뽑고 난 인형을 담을 배열이다.
##2: board는 NxN 형태에 가로줄에 있는 인형들의 종류가 주어져있는 형태로 우선 board 길이만큼 dictionary를 만든다. key는 세로로 몇 번째 줄인지, value는 그 줄에 들어있는 인형들의 종류로, 오른쪽일수록 위에 있고 왼쪽에 있을수록 밑에 있는 인형이다. (for문을 돌렸을 때 board[::-1]로 돌렸기 때문에 append만으로 이렇게 구현하는 것이 가능하다.) 0인 경우는 인형이 없는 경우이므로 dictionary의 value에 넣지 않는다.
##3: moves를 탐색한다. line의 value 배열의 길이가 0이면 더 이상 꺼낼 인형이 없다는 뜻이므로 pass하고, 아니면 하나 꺼낸다. 이 꺼낸 인형이 변수 pick에 해당한다. box에 pick을 넣고 box의 길이가 1보다 클때 맨 위에 있는 2개를 검사한다. 같으면 2개 지우고 answer값을 2 더해준다.
+@:
추가로 확인해본 테스트케이스다.
solution(board=[[0,0,0,0,0,0],[0,0,1,0,3,0],[0,2,5,0,1,2],[4,2,4,4,2,6],[3,5,1,3,1,6],[1,2,3,4,5,6]],
moves=[1,4,2,2,2,2,6,6,6])
답이 8 이 나오면 된다.
## 풀다가 했던 실수:
문제 조건에서 NxN board인데 5x5로 보고 line을 {1: [], 2: [], 3: [], 4: [], 5: []} 으로 놓고 풀었더니 런타임에러가 떴다. moves에 6이나 9가 있다면 line에 해당하는 key값이 없기 때문이다.