Baekjoon Review

[Gold 4] 17298 오큰수

hanseongbugi 2024. 10. 9. 16:31

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

 

문제에서 오큰수는 오른쪽에 있는 가장 인접한 큰 수라고 나와있다.

따라서 기본적으로 오큰수를 찾는 방법은

2중 배열을 사용해서 구하면 된다.

 

하지만 위 방식은 O(N^2)이기 때문에 시간 초과가 발생한다.

 

따라서 스택을 사용한 방식을 사용해야한다.

스택을 사용해 오큰수를 구하는 방식은 아래와 같다.

1. 맨 뒤에 있는 수 부터 순차적으로 탐색한다.

2. 스택에 top에 있는 값이 현재 알아볼 값보다 작거나 같으면 스택에서 제거

3. 스택이 비어있다면 -1을 오큰수로 지정하거나, 스택의 top을 오큰수로 지정

4. 스택에 현재 탐색할 값을 삽입

 

위 방식을 사용하면 [3, 5, 2, 7]인 경우 아래와 같이 흘러가게 된다.

1. S : {}

A : 7

NGE : { , , ,-1}

 

2. S : {7}

A : 2

NGE : { , , 7,-1}

 

3. S : {7, 2} -> {7}

A : 5

NGE : { , 7, 7,-1}

 

4. S : {7, 5}

A : 3

NGE : {5, 7, 7,-1}

 

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

int N;
int arr[1000001];
int NGE[1000001];
vector<int> v;

int main() {

    cin>>N;

    int A;
    for(int i = 0;i<N;i++)
        cin>>arr[i];
    
    // 7 2 5 3
    for(int i = N-1;i>=0;i--){
        while(!v.empty() && v.back() <= arr[i]){
            v.pop_back();
        }
        if(v.empty())
            NGE[i] = -1;
        else
            NGE[i] = v.back();

        v.push_back(arr[i]);
    }
    for(int i = 0;i<N;i++)
        cout<<NGE[i]<<' ';
    
}