Compy's Blog
432 words
2 minutes
[BOJ] 오큰수
2025-02-20

오큰수

TimeLimitMemoryLimitConditionTAG
1s512MB(1 ≤ N ≤ 1,000,000
1 ≤ Ai ≤ 1,000,000)
Stack

전형적인 모노톤 스택 연습 문제입니다.

모노톤 스택?

모노톤 스택(Monotonic Stack)이란?#

모노톤(Monotonic)이라는 말은 “단조로운”, “한 방향으로 증가/감소하는” 이라는 뜻을 가지고 있습니다. 그래서 이걸 스택에 적용해보면 어떻게 이해할 수 있을까요?

바로 스택 내의 모든 요소들이 일정한 순서(오름차순 또는 내림차순)을 유지하는 형태의 스택을 말한답니다

간단한 작동 원리#

제가 핵심 원리로 생각하는 것은 새로운 요소를 추가할 때마다 이 스택의 단조성을 유지하는 것입니다.

모노톤 스택은 당연히 시간 복잡도가 O(N)으로 단순히 본 문제를 풀면 시간 초과가 나는 코드를 효과적을 줄일 때도 쓰이는 등 정말 여러 문제에서 쓰입니다. 뭐 빌딩이 보인다. 내 친구가 보인다 등등 뭐 이런 문제에서 많이 쓰이더라구요!

그래서 이런 모노톤 스택 연습해보시길 강추 드립니다.

정답 코드
#include <iostream>
#include <stack>

using namespace std;

void print(int* res, int n){
    cout << "\n";
    for(int i = 0; i < n; i++){
        cout << res[i] << " ";
    }
    cout << "\n";
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    string s;
    int n;
    cin >> n;
    
    stack<int> stack;
    int result[1000000];
    int origin[1000000];

    for(int i = n - 1; i > -1; i--){
        result[i] = -1;
        origin[i] = -1;
        cin >> origin[i];
        while(!stack.empty() && origin[i] > origin[stack.top()]){
            result[stack.top()] = origin[i];
            stack.pop();
        }
        //print(result, n);
        //cout << origin[i] << " " << (stack.empty() ? 0 : stack.top()) << "\n\n";
        stack.push(i);
    }
    
    for(int i = n-1; i > -1; i--){
        cout << result[i] << " ";
    }
    
    
}
[BOJ] 오큰수
https://compy07.github.io/Blog/posts/boj/17298/
Author
뒹굴뒹굴 이정훈 공부방
Published at
2025-02-20