문제풀이/백준(Boj) 문제풀이

[백준][스택] - 2493. 탑

얄루몬 2022. 7. 15. 18:07

n = int(input())
top = list(map(int,input().split()))
answer = [0] * n
stack= []

for i in range(n):
    while stack:
        if stack[-1][1] > top[i]:
            answer[i] = stack[-1][0] + 1
            break
        else:
            stack.pop()
    stack.append([i, top[i]])

print(*answer)
  • stack에 들어간 값과 현재 값을 비교해서 stack에 들어있는 값이 더 크다면 현재 index + 1(0부터 시작했으니) 해준 값을 answer에 넣어준다. (들어가지 않는다면 자신보다 큰 경우가 없어서 초기화해주었던 값인 0이 그대로 출력된다.)
  • 바로 직전의 값을 stack에 넣어서 뒤에 값이 큰지 작은지를 확인한 뒤 뒤에 값이 작다면 왼쪽으로 레이저를 보낼 때 수신되는 것을 의미하기에 해당 index에 +1 을 해주면 된다. 
  • 이때 바로 앞의 값이 작은 경우엔 stack에서 해당 수를 빼주고 바로 또 그 앞의 수를 확인해서 그 수보다 현재 수가 작으면 해당 index + 1 값을 answer 값으로 돌려준다.