[프로그래머스] Lv.1 크레인 인형뽑기 게임 (Python)

seulzzang·2022년 9월 14일
0

코딩테스트 연습

목록 보기
9/44

📍문제

[프로그래머스] Lv.1 크레인 인형뽑기 게임

📍풀이

  • board는 크레인의 상태를 나타내준 2차원 배열이다.
    해당 문제의 예시 그림.
  • board = [[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]]가 크레인 인형뽑기의 상태를 나타내 주고 있다. (0은 인형이 없다는 뜻, 네오가 1번 인형, 무지가 2번 인형, 프로도가 5번 인형 이런식)
  • 크레인이 이동하면서 board의 원소가 0이 아니라면 오른쪽 바구니에 해당 번호의 인형을 담아준다.
    • board에서 오른쪽 바구니에 담아줬다면, 해당 board는 비워준다. (0으로 만들어줌)
    • 같은 종류의 인형이 들어오면 인형이 터지고, answer+=2를 해준다. (같은 인형은 두개가 만나면 터지기 때문에)

💻코드

첫번째 작성

def solution(board, moves):
    answer = 0
    doll_list = [] # 바구니
    # 순서대로 크레인의 움직임 위치를 받는다.
    for i in moves:
        for j in range(len(board)):
            # 뽑힐 인형이 없다면 다음 동작으로 넘어감
            if board[j][i-1] == 0:
                continue
            else:
                doll_list.append(board[j][i-1])
                board[j][i-1] = 0
                # 인형이 두개이상 쌓였을 때
                if len(doll_list) > 1:
                    # 끝에 있는 두개가 동일하면
                    if doll_list[-1] == doll_list[-2]:
                        # 인형이 터지니까 +2
                        doll_list.pop(-1)
                        doll_list.pop(-2)
                        answer += 2
                break
    return answer

이렇게하면 당연히~ 테스트케이스도 통과를 못한다.

if doll_list[-1] == doll_list[-2]:
        # 인형이 터지니까 +2
        doll_list.pop(-1)
        doll_list.pop(-2)
        answer += 2

단순히 doll_list.pop(-1)해서 맨 뒤의 인형을 터뜨렸으니 그 아래있는 것을 pop해주면 되겠지? 했는데 맨 끝값이 사라지면 뒤에서 두번째 인덱스는 자연스럽게 다시 맨 끝값이 된다.
doll_list.pop(-2)를 해주는게 아니라 doll_list.pop(-1)을 한번 더 해줘야 하는 것이다. 빡통인가 나🤦‍♀️

두번째 작성

def solution(board, moves):
    answer = 0
    doll_list = [] # 바구니
    # 순서대로 크레인의 움직임 위치를 받는다.
    for i in moves:
        for j in range(len(board)):
            # 뽑힐 인형이 없다면 다음 동작으로 넘어감
            if board[j][i-1] == 0:
                continue
            else:
                doll_list.append(board[j][i-1])
                board[j][i-1] = 0
                # 인형이 두개이상 쌓였을 때
                if len(doll_list) > 1:
                    # 끝에 있는 두개가 동일하면
                    if doll_list[-1] == doll_list[-2]:
                        # 인형이 터지니까 +2
                        doll_list.pop(-1)
                        doll_list.pop(-1)
                        answer += 2
                break
    return answer

pop부분만 고쳐줬더니 바로 통과.
break를 걸어주는 이유는 해당 크레인에서 작업이 끝나면 더이상 파고들 필요가 없기 때문에.
풀고 나서 다른사람 풀이 보니까 스택 자료구조형임을 깨달았다.. 자료구조 공부가 부족한듯.
마지막에 들어온 인형들이 같으면 터뜨려준다! 니까.. LIFO(Last In First Out)임..

📍다른사람 풀이

def solution(board, moves):
    stacklist = []
    answer = 0

    for i in moves:
        for j in range(len(board)):
            if board[j][i-1] != 0:
                stacklist.append(board[j][i-1])
                board[j][i-1] = 0

                if len(stacklist) > 1:
                    if stacklist[-1] == stacklist[-2]:
                        stacklist.pop(-1)
                        stacklist.pop(-1)
                        answer += 2     
                break

    return answer

뭐.. 비슷한데 나는 걍 이게 스택이란걸 생각 1나도 못했음..
이사람은 깨달았으니 stacklist라고 변수를 줬을까..?😢
난 너무 갈길이 멀어.. 눈물이 난다...

profile
중요한 것은 꺾이지 않는 마음

0개의 댓글