문제 출처
1. 문제설명
- 수열이
N
개 주어진다.
- 각 원소의 오른쪽 수 중 가장 큰 수가 오큰수가 된다.
- 각 원소의 오큰수를 구하라.
2. 알고리즘 설계
- 스택 문제이다.
- 이전 옥상정원 문제와 비슷하게 풀이할 수 있다.
3. 로직
- 스택에 값을
push
한다.
- push된 값 중에 현재 값보다 작으면 스택에서 제거한다.
- 제거된 스택의
top
값이 오큰수가 된다.
4. 전체 코드
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
int n, tmp;
cin >> n;
vector<int> v(n), ans(n);
for (int i = 0; i < n; i++) cin >> v[i];
stack<int> st;
for (int i = v.size() - 1; i >= 0; i--) {
while (!st.empty() && st.top() <= v[i]) st.pop();
if (!st.empty()) ans[i] = st.top();
else ans[i] = -1;
st.push(v[i]);
}
for (int a : ans) cout << a << ' ';
return 0;
}