개요
문제 해결을 위한 알고리즘을 작성합니다
다른 고수들의 알고리즘을 보고 내 코드를 디스 합니다.
문제
- 게임 화면은 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 해서 신박한 코드를 읽어보았다