문제
크레인 인형 뽑기 게임
아래 그림에서 보면
1. 가로 한줄을 배열 1개라고 본다.
2. 즉 2차원 배열로 생각한다. board = [ [], [], [], [], [] ]
3. 1,2,3,4,5 열에서 하나씩 뽑는데 같은 그림이 연속으로 쌓였을 때, 둘다 없앤다.
4. 빈칸은 0 , 각 그림은 각기 다른 숫자로 변형
5. 크레인 작동 배열 moves가 주어질 때,
사라진 인형 개수 반환하는 함수 solution() 구현하기.
이번 문제는 책에 아주 자세히 설명되어서
대부분 책의 내용을 그대로 추출!
앞서 제일 위에서 봤던 동물 이미지들이
아래와 같은 2차원 배열을 → 변수 bucket(stack)에 담기
[
총 5개에 stack으로 만들고,
거꾸로 쌓기 이때 0은 push하지 않는다.
문제 풀기
1. lanes 배열 만들기
주어진 board를 세로로 세웠다 가정하고, 각 열의 데이터에서 0을 제외한 채
다시 새로운 2차원 배열(lanes)에 위 그림에서 '변환된 스택' 처럼 넣기
즉, lanes = [ [3,4] ,[5,2,2], [1,4,5,1] , [3,4] , [1,2,1,3] ] 이와 같이 저장
2. 인형 뽑는 로직
인형을 담을 바구니 bucket = [] 을 놓고
가. 뽑기 번호 moves에서 뽑은 인덱스에 맞는 lanes 인덱스에 데이터가 있는 경우
1) bucket에 데이터가 없으면 무조건 넣고
2) 있으면 bucket에 최근 번호와 뽑은 번호를 비교
가) 같으면 정답 cnt+=2
나) 다르면 append한
틀린 코드
def solution(board, moves):
answer = 0
[[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]]
#이 모양 그대로 lanes를 만들거기 때문에
lanes = [[] for _ in range(len(board[0]))]
j = 0
for i in range(len(board[0])-1,-1,-1) :
for j in range(len(board)):
if board[i][j] :
lanes[j].append(board[i][j])
stack= []
for i in moves :
if not stack :
stack.append(lanes[i-1].pop())
else :
if lanes[i-1][-1] == stack[-1]:
stack.pop()
answer+=2
else :
stack.append(lanes[i-1].pop())
return answer
한참 고민하다가 빼먹은 로직을 찾았다.
맞는 코드
위에 틀린 코드에서 2가지 부분을 놓쳤다.
★ 해당 lane에 뽑을 인형이 있는 경우만
★ 인형을 뽑았으니까 그 lanes에서도 pop
def solution(board, moves):
answer = 0
[[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]]
#이 모양 그대로 lanes를 만들거기 때문에
lanes = [[] for _ in range(len(board[0]))]
j = 0
for i in range(len(board[0])-1,-1,-1) :
for j in range(len(board)):
if board[i][j] :
lanes[j].append(board[i][j])
bucket = []
for i in moves :
if lanes[i-1] : # ★ 뽑을 인형이 있는 경우만
if not bucket : # bucket이 비어있다면
bucket.append(lanes[i-1].pop())
else : # 비어있지 않으면, 데이터가 이미 있으면
if lanes[i-1][-1] == bucket[-1]:
bucket.pop()
lanes[i-1].pop() # ★ 인형을 뽑았으니까 그 lanes에서도 pop
answer+=2
else :
bucket.append(lanes[i-1].pop())
return answer
이 정도 수준 문제가 나오면
안보고 짤 수 있을까 흠.
'프로그래밍 이야기 > 파이썬 코딩 테스트 스터디' 카테고리의 다른 글
파이썬 코딩테스트 스터디 4주차 #3 - 기능 개발 (2) | 2024.07.14 |
---|---|
파이썬 코딩테스트 스터디 4주차 #2 - 요세푸스 문제 (0) | 2024.07.09 |
파이썬 코딩테스트 스터디 3주차 #5 - 주식 가격 (0) | 2024.07.08 |
파이썬 코딩테스트 스터디 3주차 #4 - 짝지어 제거하기 (0) | 2024.07.07 |
파이썬 코딩테스트 스터디 3주차 #3 - 10진수를 2진수로 변환하기 (0) | 2024.07.07 |