[프로그래머스 / Level 1] 크레인 인형뽑기 게임 (파이썬) 2019 카카오 개발자 겨울 인턴쉽

khyojun·2022년 7월 13일
0

코테연습

목록 보기
5/21

📌문제 설명

📌제한 사항

  • board 배열은 2차원 배열로 크기는 "5 * 5" 이상 30 * 30" 이하입니다.
  • board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
    • 0은 빈 칸을 나타냅니다.
    • 1~100의 각 숫자는 각기 다른 인형의 모양을 의미하고 같은 숫자는 같은 모양의 인형을 나타냅니다.
  • moves 배열의 크기는 1 이상 1,000 이하입니다.
  • moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.

📌 Solution
이번 문제를 보자마자 처음엔 "어! Stack인데" 하고 이미 리스트부터 이름을 스택으로 만들어놨다. 근데 어떻게 활용을 해야할 지 헷갈리기도 하였고 그렇게하여 일단 코테에서도 문제를 풀다가 막히는 상황이 왔을때는 결국엔 구현을 해야하기에 일단 구현을 하게 되었다.

def solution(board, moves):
    answer = 0
    stack=[]
    cnt=0
    
    while cnt != len(moves):
        much=len(board[moves[cnt]-1])
        now_x=moves[cnt]-1
        for i in range(much):
            if board[i][now_x]==0:
                continue
            else:                   
                tmp=board[i][now_x]
                board[i][now_x]=0
                stack.append(tmp)
                break                        
        cnt+=1 
    

    while True:
        flag=0
        i=0
        while True:
            if i>=len(stack)-1:
                break
            
            if stack[i]==stack[i+1]:
                del(stack[i])
                del(stack[i])
                answer=answer+2
                flag=1
            i+=1
            
        if flag==0:
            break
            
    return answer

우선 개선된 코드를 보기전 이 문제를 풀면서 핵심이 되는 코드가 있었다.
바로 del(stack[i]) 인데 이것이 두 번 연속으로 진행이 되었다는 것은 del()과정을 거치면 어떻게 되는지 보는게 좋을 거 같다.

다음 과정에서 간단히 del의 역할은 만약 바구니 안에 자신과 같은 모양을 한 것이 인접하고 있으면 그 두 모양 다 없애버리는 것이다.

그렇게 될 경우 1,2,2,3 일 경우 2,2는 사라지고 1,3 이런 식으로 된다. 즉 del을 할 때 뒤에있는 값들이 앞 인덱스로 밀려오는 것이므로 del(stack[i-1])이 아닌 del(stack[i])를 2번 반복한 것이 맞았다.

그러나 다음의 코드는 이름을 stack으로만 작성했지 실제로 이 자료구조를 제대로 사용하지 않아 코드를 수정할 필요가 있어보인다.

answer = 0
stack=[]
cnt=0
moves=[1,5,3,5,1,2,1,4]
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]]

for i in moves:
    for j in range(len(board)):
        if board[j][i-1]!=0:  
            stack.append(board[j][i-1])              
            board[j][i-1]=0
            if len(stack)>1:
                if stack[-1]==stack[-2]:
                    stack.pop(-1)
                    stack.pop(-1)
                    answer+=2
            break             
    
flag=0
    

print(answer)

다음이 2번째 버전이다. 확실히 짧아졌다. 이 코드는 stack을 이용하여 비교를 하였는데 머릿속으로만 이렇게 생각하고 구현을 이렇게 하지 못했던거 같다.
솔직히 stack[-1] stack[-2]에서 충격을 살짝 먹었다. 기반이 많이 부족하다고 느꼈다랄까?

문제 해결하며 알게 된 점

  1. 파이썬의 del(), remove(), pop()등 각각을 수행하였을때 인덱스를 어떻게 활용해야 할 지
  2. -1, -2 인덱싱같은 것
profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글