[BOJ] 17298


問題...
fail log
me
N=int(input())
A=deque(map(int,input().split()))
recents=deque([A.pop()])
res=deque([-1])
while A:
    rear=A.pop()
    found=False
    for recent in recents:
        if rear < recent:
            res.appendleft(recent)
            found=True
            break
    if not found : res.appendleft(-1)
    if len(A)!=0 and A[-1]< rear:
            recents.appendleft(rear)
print(*res)
今ではスタックを利用しているようには見えません.
38時間を超える45時間から時間を超える程度にします.
solution
import sys
n = int(input())
A = list(map(int, sys.stdin.readline().split()))
answer = [-1] * n
stack = []


stack.append(0) # 첫 번째 index
for i in range(1, n): # 비교
    while stack and A[stack[-1]] < A[i]: # while 대신 if는 안되나?
        answer[stack.pop()] = A[i] # 해당 자리에 오큰수 넣기
    stack.append(i)


print(*answer)
そこでスタックを利用して問題を解く.
stackは、要素値以外の要素にインデックスを追加するために使用されます.
例えば、数列が3 5 2 7の場合
初期スタックには0が含まれ、A[1]とA[Stack[1]の要素を比較します.
stack[1]は0なので、A[1]とA[0]を比較します.A[1]の値が大きいからです.
答え[0]の値はA[1]の5です.すなわち0の5大数を求めた.
また,0インデックスは大きな数を求めたのでpopし,次に求めるインデックス1を入れる.
現在iが最大数を求めていない場合でも、stackに現在のインデックスiを追加する必要があります.
このようにしてこそi+1の五大数を求めることができるので、i+1の五大数を求めると、自動的にiの五大数を求めることになる
リファレンス