본문 바로가기
파이썬/파이썬 알고리즘

파이썬 프로그래머스 level 1. 크레인 인형뽑기 게임

by Go! Jake 2021. 4. 26.

  문제

게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.

 

  풀이

def solution(board, moves):
    container=[-1]
    answer=0
    for i in moves:
        for j in range(len(board)):
            if board[j][i - 1] != 0:
                if board[j][i-1]!=container[-1]:
                    container.append(board[j][i - 1])
                    board[j][i-1]=0
                    break
                elif board[j][i-1]==container[-1]:
                    board[j][i - 1] = 0
                    container.pop()
                    answer+=2
                    break
    return answer

 

<1>

def solution(board, moves):
    container=[-1]
    answer=0

container는 문제에서 '바구니'에 해당하는 리스트이다.

바구니에 담을 때 '이전에 담겨진 인형 값'과 같은 지 확인하기 위한 리스트이다. 따라서 해당 바구니가 정확할 필요는 없고, 이전 값과 비교용으로만 사용된다. 시작은 -1를 넣어주었다. 이유는 -1를 넣지 않는 경우, 리스트 내에 아무 인형도 없을 때 이전값과 비교하려고하면 오류가 발생할 것이기 때문이다.

 

<2>

    for i in moves:
        for j in range(len(board)):

moves는 인형 뽑는 기계에 움직이므로 for문을 통해 계속해서 반복되도록 로직을 구성한다.

시뮬레이션 유형 등 문제에서는 moves를 반드시 for문으로 돌려 계획된대로 동작하도록 구성하는 것으로 보인다.

몇 번째 열을 탐색할 지 결정하면 해당 열을 모두 탐색해야하므로 len(board)를 사용하여 모든 행이 탐색되도록 하였다.

 

 

<3>

            if board[j][i - 1] != 0:
                if board[j][i-1]!=container[-1]:
                    container.append(board[j][i - 1])
                    board[j][i-1]=0
                    break
                elif board[j][i-1]==container[-1]:
                    board[j][i - 1] = 0
                    container.pop()
                    answer+=2
                    break
    return answer

board[j][i-1]이면 i-1인 열을 고정된 상태에서 해당 열을 탐색하도록 구성된다.

문제에서 0번 index를 사용하지 않으므로 사용 때 -1을 붙여 리스트를 참조할 수 있도록 해야한다.

 

if board[j][i-1]!=0 보통 무언가가 있거나 없거나 판단할 때 !=을 사용하여 판단한다. 이 때 인형의 존재를 판단하기 위해 사용되었다.

 

    if board[j][i-1]!=container[-1]:

        container.append(board[j][i-1])

        board[j][i-1]=0

        break

container의 맨 마지막 값과 새로 탐색된 인형값이 같지 않다면 container에 넣어 추후에 비교될 수 있게 만들어주고 board는 0으로 처리 해 준다. 또한 해당 열에 대한 탐색은 끝났으므로 break로 for문을 멈춘다. 

 

    elif board[j][i-1]==container[-1]:
        board[j][i - 1] = 0
        container.pop()

        answer+=2
        break
return answer

container의 맨 마지막 값과 새로 탐색된 인형값이 같다면 2개의 인형이 사라지므로 answer+=2를 사용한다.

container.pop()을 통해 마지막 인형을 빼 준다.

 

 

댓글