본문 바로가기

알고리즘/KOALA 알고리즘 스터디

[BOJ/C++] 17298번 오큰수

https://www.acmicpc.net/problem/17298

이 문제에서 구해야하는 건

1. 자신보다 뒤에 입력

2. but 자신보다 큼

3. 그중에 가장 빨리 입력된 수

 

배열로 받아서 뺑글뺑글 돌면서 확인해볼 수도 있지만 이중포문으로 시간복잡도가 n^2이 된다..

이때 사용할 수 있는건 stack

 

#include <iostream>
#include <stack>
using namespace std;

long long n;
stack<long long> s;
long long a[1000001];
long long nge[1000001];

int main()
{
    cin >> n;

    for (long long i = 0; i < n; i++)
    {
        cin >> a[i];
    }

    for (long long i = 0; i < n; i++)
    {
        // 0~i-1 와 i번째 인덱스 수를 비교해서 오큰수 갱신
        while (!s.empty() && a[s.top()] < a[i])
        {
            nge[s.top()] = a[i];
            s.pop();
        }

        // i번째
        s.push(i);
    }

    // 오큰수 없는 거 -1 처리
    while (!s.empty())
    {
        nge[s.top()] = -1;
        s.pop();
    }

    for (int i = 0; i < n; i++)
    {
        cout << nge[i] << " ";
    }
}