📌문제 설명
📌제한 사항
- 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]에서 충격을 살짝 먹었다. 기반이 많이 부족하다고 느꼈다랄까?
✨ 문제 해결하며 알게 된 점