N이 100만이므로 O(N²)으로 절대 풀 수 없고 최소한 O(N×logN)으로 풀어야 합니다.
arr[5] = 3 8 2 7 9 이라는 예를 생각해봅시다.
바로 이렇게 arr 배열의 다음 수와 ans 배열의 다음 수 양쪽 모두보다 클 경우가 가장 까다롭습니다.
따라서 여기서 ‘아, 단순히 인접한 배열끼리 비교해서는 안 되는구나’ 라는 점을 깨달아야 합니다.
그러므로 스택(stack)을 사용하는 아이디어를 떠올리면 100점입니다.
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int N;
cin >> N;
stack<pair<int, int>> stk;
vector<int> answer(N, -1);
for (int i = 0; i < N; i++) {
int num;
cin >> num;
if (stk.empty() || stk.top().first > num) {
stk.emplace(num, i);
continue;
}
while (!stk.empty() && stk.top().first < num) {
answer[stk.top().second] = num;
stk.pop();
}
stk.emplace(num, i);
}
for (auto i : answer) cout << i << ' ';
return 0;
}