1. 문제
https://programmers.co.kr/learn/courses/30/lessons/64061?language=python3
2. 풀이 방법
- 각 컬럼의 가장 위에 있는 요소 배열을 생성하고 갱신합니다.
- 제거해야 할 컬럼의 위치에 맞춰서 최상위 요소를 뽑아냅니다. 뽑아낸 요소와 뺀 요소들의 배열의 상단에 있는 요소들을 비교하여 같으면 제거합니다.
3. 소스코드
3.1. 내가 푼 소스코드
answer = 0
def delete_element(ans_stack):
global answer
cnt = 1
for i in range(len(ans_stack)-2, -1, -1):
if ans_stack[i] == ans_stack[-1]:
cnt += 1
else :
break
if cnt > 1 :
for i in range(cnt):
ans_stack.pop()
answer += 1
def solution(board, moves):
ans_stack = []
arr_idx = [ -1 ] * len(board)
# 각 컬럼의 가장 위에 있는 요소 배열 -> arr_idx 갱신
for row_idx in range(len(board)):
for col_idx in range(len(board)):
if arr_idx[col_idx] != -1 :
continue
if board[row_idx][col_idx] != 0:
arr_idx[col_idx] = len(board) - row_idx - 1
for move in moves:
# 요소 없으면 건너 뛰기
if arr_idx[move-1] == -1:
continue
ans_stack.append(board[(len(board) - 1) - (arr_idx[move-1])][move - 1])
arr_idx[move-1] -= 1
delete_element(ans_stack)
return answer
3.2. 숏코딩 by programmers
- 위의 풀이와 다르게 뺀 인형 stack의 최상단에서 바로 아래 있는 요소만 체크하면 됩니다.
- 컬럼마다 최상위 요소가 어디 있는지 필요한 별도의 배열을 생성하지 않습니다.
def solution(board, moves):
stacklist = []
answer = 0
for i in moves:
for j in range(len(board)):
if board[j][i-1] != 0:
stacklist.append(board[j][i-1])
board[j][i-1] = 0
if len(stacklist) > 1:
if stacklist[-1] == stacklist[-2]:
stacklist.pop(-1)
stacklist.pop(-1)
answer += 2
break
return answer
PREVIOUSNSIS란? 개념 정리
NEXTMIPS란? 개념 정리