소프트웨어/자료구조 + 알고리즘
프로그래머스 / 크레인 인형뽑기 게임 / level 1 / 파이썬
moonionn
2021. 3. 21. 00:28
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
문제가 뭔가 복잡해보이지만 로직은 간단합니다.
moves 리스트가 끝날 때까지 board를 돌고,
뽑힌 인형은 새로운 스택을 생성해 그곳에 담습니다.
같은 인형 두 개가 겹치면 스택에서 그 두 인형을 제거합니다.
나의 풀이
해설
우선 뽑힌 인형을 담아줄 스택을 생성합니다.
def solution(board, moves):
answer = 0
bucket = []
순서대로 크레인의 움직임 위치를 받습니다.
크레인의 위치를 받으면 2차원 배열의 가장 첫 배열(상단 배열)부터
인형의 유무를 체크합니다.
for move in moves:
for line in board:
if line[move-1] != 0:
# move는 1부터 칸 전체 길이 까지의 숫자입니다.
# 따라서 list의 index로 사용하려면 1을 빼줘야 합니다.
크레인의 위치에 인형이 있다면
스택에 인형을 넣어주고 해당 위치는 인형이 없는 상태인 0으로 바꿔줍니다.
인형을 찾은 뒤 굳이 남은 아래칸들을 뒤질 필요가 없으니
for문에서 나가기 위해 break를 겁니다.
for move in moves:
for line in board:
if line[move-1] != 0:
bucket.append(line[move-1])
line[move-1] = 0
break
인형을 하나 뽑을때마다 스택에 겹치는 인형이 있는지 확인해줘야 합니다.
이 때 스택에 인형이 두 개 이상 쌓였는지 먼저 체크하지 않으면 런타임 에러가 날 수 있습니다.
if len(bucket) >= 2 and bucket[-1] == bucket[-2]:
answer += 2
bucket = bucket[:-2]
전체 코드
def solution(board, moves):
answer = 0
bucket = []
for move in moves:
for line in board:
if line[move-1] != 0:
bucket.append(line[move-1])
line[move-1] = 0
break
if len(bucket) >= 2 and bucket[-1] == bucket[-2]:
answer += 2
bucket = bucket[:-2]
return answer