Slow is better than NOTHING

Programmers 풀이/[KaKao]

[Python] 프로그래머스 2019 KAKAO 코딩테스트 - 크레인 인형뽑기 게임

Jeff_Kang 2020. 12. 20. 02:33
반응형

- 문제 설명

자세한 문제설명은 아래의 링크로 대신합니다.

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


주어진 조건에 맞는 로직을 구현하여 인풋, 아웃풋을 정의하는 간단한 문제입니다. 애니팡같은 형식의 게임 로직을 구현하는 것으로, 자료구조 중 Stack을 사용할 수 있는 지에 대한 문제로 생각됩니다. 

주어진 입력 배열

[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]


 간단히 예시 설명을 하자면, 다음과 같은 2D array 배열이 존재하며 각각의 캐릭터는 숫자에 대응됩니다.
프로도: 1, 화난초록오리(?): 3, 무지: 2, 어피치:4, 멍때리는강아지(?): 5
이후 [1,5,3,5,1,2,1,4] 형태의 move라는 크레인의 위치가 주어지고, 크레인은 가장 위에 있는 인형을 뽑습니다.
예, move=1인 경우 1번째 열의 가장 위에 있는 "어피치" 가 선택이 됩니다.

move=1일때 크레인이 선택하는 어피치
같은 인형이 들어오면 사라지는 인형들

선택된 어피치는 오른쪽의 빈 "Stack"으로 가장 아래에 쌓이게 됩니다. 이후, 모든 move값들을 처리를 하면서 입력 값이 stack의 가장 마지막 값과 같다면, 두 개의 인형을 터뜨리고 사라진 인형 갯수를 2개씩 더하면서 값을 return 해주면 됩니다. 최종적으로 answer로 제출해야되는 값은 "터뜨린 인형 갯수" 입니다.
stack의 자료구조 특성인 FILO 구조를 이해하셨다면, List를 이용하여 간단하게 구현하실 수 있습니다. 
주어진 stack 에서 가장 마지막 2개를 뽑아 같다면, 터트리고 아니면 stack을 계속 쌓아나가면 됩니다.


문제 풀이를 위해 저는 다음과 같이 3가지 조건을 세웠습니다.
긴 문장 지문을 이해하고 이것을 자신만의 조건으로 풀이해내는 연습을 해보고있습니다.
저는 주어진 제한사항과 지문을 다음과 같이 단계별로 나누어, 각 조건을 직관적인 함수로 구현해보았습니다.

- 접근 방법

1. move가 주어졌을 때 board로 부터 인형을 1개 Pick한다.
 - 1-1 인형을 뽑아서 옮겼으므로, board로 새롭게 업데이트해주어야한다.
2. 오른쪽 List에 쌓는다.
3. List 를 체크하여, 같은 인형이 들어오면 부순다.

위 조건을 만족하는 코드는 다음과 같습니다.
각 함수 별로 기능을 나누어 코드로 옮겨보는 연습을 해보았습니다. 

더보기
def solution(board, moves):
    stack_doll=[] 
    answer=0 
    for move in moves:
        doll, board = pick_doll_from_board(board, move) # 조건 1
        if doll !=0: # 0 인 곳은 빈칸이므로 옮기지 않습니다.
            stack_doll.append(doll) # 조건 2
        stack_doll, distroy= check_doll_basket(stack_doll) # 조건 3 
        answer += distroy
    return answer

def pick_doll_from_board(board, move_num):
    # given move, pick one doll
    # input  : current board, move number
    # return : picked doll, new board
    doll = 0
    for row_num,num in enumerate(board):
        if num[move_num-1] !=0:
            doll = num[move_num-1]
            board[row_num][move_num-1] = 0 # 조건 1-1, board update
            break
    return doll, board
    
def check_doll_basket(stack_doll):
    # given doll list, distroy the dolls if input and last one are same
    # input  : list of picked doll
    # return : updated list of doll, count of distroy
    if len(stack_doll) >=2 :
        input_doll = stack_doll[-2:][0]
        current_doll = stack_doll[-2:][1]
        if input_doll == current_doll :
            stack_doll.pop()
            stack_doll.pop()
            return stack_doll, 2
    return stack_doll, 0
반응형