문제

https://programmers.co.kr/learn/courses/30/lessons/64061

풀이

def solution(board, moves):
    answer = 0
    stack = []
    ht = {}
    for mov in moves :
        if not mov in ht :
            ht[mov] = [i[mov-1] for i in board if i[mov-1] > 0]
            ht[mov].reverse()
        if len(ht[mov]) > 0 :
            if len(stack) > 0 and stack[-1] == ht[mov][-1] :
                stack.pop()
                answer += 2
            else :
                stack.append(ht[mov][-1])
            ht[mov].pop()

    return answer

고작 스택문제 하나 푸는데 해시까지 사용한 이유는
리스트를 column 단위로 다시 쪼개어 저장한 다음
Call-by-reference 느낌으로 pop() 시키고 있었는데
실제 동작은 Call-by-value 였기 때문에
Call-by-reference 느낌을 낼 수 있도록 해시에 저장시켰다.

덕분에 가독성이 많이 떨어지는 지저분한 코드가 만들어졌다.
대신 moves가 많아질수록 속도는 빨라지겠지?

더 나은 풀이

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

스택을 간단히 이용한 이쪽이 가독성이 훨 좋은 것 같다.

댓글남기기