본문 바로가기

코드읽기

[코드디스] 크레인 인형뽑기 게임- 프로그래머스-Level1

개요
문제 해결을 위한 알고리즘을 작성합니다
다른 고수들의 알고리즘을 보고 내 코드를 디스 합니다.


문제

  • 게임 화면은 1 * 1칸으로 이루어진 N * N 크기의 정사각형 격자
  • 각 칸에는 인형이 들어있으며 인형이 없는 칸은 빈칸
  • 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있음
  • 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다.
  • 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이면 두 인형은 터뜨려짐
  • 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다

입력

  • board 배열은 2차원 배열
  • board의 각 칸에는 0 이상 100 이하인 정수가 담김
  • 0은 빈 칸
  • 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형
  • moves 배열의 크기는 1 이상 1,000 이하, 각 값은 1 이상, borad 배열의 가로 크기 이하인 자연수

출력

크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수

 

아이디어

0인 부분은 빈칸이니 for문 안에서 pass 하고 0 이상의 값이 나오면 '바구니'에 추가한다. 바구니에 1개 이상의 원소가 있으면 동일한지 확인

입출력 예시

 


작성 코드

def solution(board, moves):
    answer = 0

    # 인형 통
    busket = []

    # 움직이는 좌표
    for i in moves:
      # 좌표확인을 위해 N만큼 확인
      for j in range(len(board[0])):

        # 0이면 패스
        if board[j][i-1] == 0:
          pass

        # 0이 아니면 리스트에 추가
        else:
          busket.append(board[j][i-1])
          # 리스트가 1이상이면 연속되는게 있나 확인
          if len(busket) > 1:

            # 같으면
            if busket[-1] == busket[-2]:
              # 2번 빼고 +2
              busket.pop()
              busket.pop()
              answer +=2
          board[j][i-1] = 0
          break
    return answer

 

 

다른 고수님 풀이

import numpy as np
def solution(board, moves):
    board = np.array(board).transpose()
    answer = [-1]
    count = 0
    for move in moves:
        print(move)

        for i, num in enumerate(board[move-1]):
            if num == 0:
                continue
            else:
                board[move-1][i] = 0
                if num == answer[-1]:
                    answer.pop()
                    count += 2
                    break
                answer.append(num)
                break

    return count

느낀 점

아직 코딩 문제 푸는데 익숙하지가 않아 생각보다 오래 걸렸다. 근데 정답을 제출하자 70명이 푼 깔끔하다고 댓글이 남겨진 코드랑 똑같아서 따로 작성안했다.
다른 고수의 넘 파이 배열로 변환해 Transpose 해서 신박한 코드를 읽어보았다