프로그래밍 이야기/파이썬 코딩 테스트 스터디

파이썬 코딩테스트 스터디 3주차 #6 - 크레인 인형 뽑기 게임

hoony926 2024. 7. 9. 13:33

 

 

문제

크레인 인형 뽑기 게임 

 

아래 그림에서 보면 

1. 가로 한줄을 배열 1개라고 본다.
2. 즉 2차원 배열로 생각한다. board = [ [], [], [], [], [] ]
3. 1,2,3,4,5 열에서 하나씩 뽑는데 같은 그림이 연속으로 쌓였을 때, 둘다 없앤다.
4. 빈칸은 0 , 각 그림은 각기 다른 숫자로 변형
5. 크레인 작동 배열 moves가 주어질 때, 
    사라진 인형 개수 반환하는 함수 solution() 구현하기.

 

코딩 테스트 합격자 되기 : 파이썬편 - 160 page

 

 

코딩 테스트 합격자 되기 : 파이썬편 - 161 page

 

이번 문제는 책에 아주 자세히 설명되어서 

대부분 책의 내용을 그대로 추출!

 

 

앞서 제일 위에서 봤던 동물 이미지들이 

코딩 테스트 합격자 되기 : 파이썬편 - 160 page

 

아래와 같은 2차원 배열을 → 변수 bucket(stack)에 담기

[

코딩 테스트 합격자 되기 : 파이썬편 - 162 page

총 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

 

 

이 정도 수준 문제가 나오면

안보고 짤 수 있을까 흠.