https://www.acmicpc.net/problem/17299
import sys
N = int(input())
A = list(map(int, sys.stdin.readline().split()))
stack = list()
ans = [-1 for _ in range(N)]
f = [0 for _ in range(1000001)]
stack.append(0)
for i in range(N):
# f를 증가
f[A[i]] += 1
# 오큰수와 같은 방식으로 품
# 스택이 끝날 때 까지 오등큰수를 찾아본다.
for i in range(1, N):
while stack and f[A[stack[-1]]] < f[A[i]]:
ans[stack.pop()] = A[i]
stack.append(i)
print(' '.join(map(str, ans)))
17298 오큰수를 풀었다면 크게 어렵지 않은 문제다. 먼저 등장한 횟수를 저장하는 f를 갱신하고 비교하는 숫자를 A 리스트가 아닌 f 리스트에서 참조하는 것으로 바꾸는것으로 마무리. 나머지는 오큰수의 풀이와 차이는 없다.