자신보다 오른쪽에 있으면서 큰 수 중에서 가장 왼쪽이 있는 수를 오큰수라고 한다. 없는 경우에는 -1이라고 한다. 크기가 N인 수열이 A가 주어질 때 각각의 오큰수를 구해보아라.
수열 A를 오른쪽에서 왼쪽 방향으로 진행하면서 숫자를 스택에 push하는데 들어오는 숫자보다 작은 숫자들을 모두 pop한 후에 push를 해준다. 이러면 그 다음으로 왼쪽 원소 차례가 되면 어차피 오른쪽 첫번째 원소는 방금 pop을 모두 해준 후 push가 된 그 원소이기 때문에 정상적인 오큰수 계산이 가능하다.
위 과정처럼 크기를 비교하면서 스택에 자신보다 작은수가 올라와있다면 수를 모두 pop 해준 후 올라오는 수를 답 리스트에 추가, 만약 큐에 아무것도 없다면 자신보다 큰 수가 오른쪽에 없었다는 것이므로 -1을 답 리스트에 추가를 반복하면 된다.
import sys
from collections import deque
input = sys.stdin.readline
# 오른쪽에서 왼쪽으로 push하면서 진행
# 들어오는 숫자가 스택의 맨 위 숫자보다 크다면 pop
n = int(input())
a = list(map(int, input().split()))
q = deque()
ans = []
for i in range(n - 1, -1, -1):
while q and q[-1] <= a[i]:
q.pop()
if not q:
ans.append(-1)
else:
ans.append(q[-1])
q.append(a[i])
ans.reverse()
print(*ans)