백준 #17298 오큰수

less than 1 minute read

백준 #17298 오큰수

수열에서 어떤 수보다 오른쪽에 있으면서 큰 수 중 가장 왼쪽에 있는 수를 출력하는 문제.
스택을 사용해서 풀 수 있다.

vector v에 모든 입력을 받은 후, for 문으로 순회한다. 스택에는 v의 index를 저장하는데, 스택의 top이 가리키는 수보다 v[i]가 클 경우 pop하고 ans vector에 저장한다.

예시)

3
3
5
5
2
2
7
7
v
v
-1
-1
ans
ans
2
2
1
1
push!
push!
pop!
pop!
초기값
초기값
v[1]과 v[stk.top()] 비교.
v[1]이 더 크니 pop 후 ans[0]에 v[1]을 저장한다.
그 후 index인 1을 push한다.
v[1]과 v[stk.top()] 비교....
v[2]와 v[stk.top()] 비교.
v[stk.top()]이 더 크니 index인 2를 push한다.
v[2]와 v[stk.top()] 비교....
v[3]과 v[stk.top()] 비교.
v[3]이 더 크니 pop 후 ans[2]에 v[3]을 저장한다.
v[3]과 v[stk.top()] 비교....
v[3]과 v[stk.top()] 비교.
v[3]이 더 크니 pop 후 ans[1]에 v[3]을 저장한다.
v[3]과 v[stk.top()] 비교....
스택이 비어있으니 index인 0을 push한다
스택이 비어있으니 index인 0을 push한다
-1
-1
-1
-1
-1
-1
-1
-1
ans
ans
-1
-1
-1
-1
-1
-1
3
3
5
5
2
2
7
7
v
v
3
3
5
5
2
2
7
7
v
v
3
3
5
5
2
2
7
7
v
v
3
3
5
5
2
2
7
7
v
v
push!
push!
push!
push!
pop!
pop!
3
3
5
5
2
2
7
7
v
v
pop!
pop!
1
1
1
1
0
0
0
0
2
2
1
1
5
5
ans
ans
-1
-1
-1
-1
-1
-1
5
5
ans
ans
-1
-1
7
7
-1
-1
5
5
ans
ans
7
7
-1
-1
7
7
ans
ans
-1
-1
-1
-1
-1
-1
5
5
Viewer does not support full SVG 1.1
#include <iostream>
#include <bits/stdc++.h>
#include <vector>
#include <stack>

using namespace std;

int N;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    stack<int> stk;
    cin >> N;
    vector<int> ans(N, -1);
    vector<int> v;
    for(int i = 0; i < N; i++) {
        int dummy;
        cin >> dummy;
        v.push_back(dummy);
    }
    for(int i = 0; i < N; i++) {
        while(!stk.empty() && v[stk.top()] < v[i]) {
            ans[stk.top()] = v[i];
            stk.pop();
        }
        stk.push(i);
    }
    for(auto it = ans.begin(); it != ans.end(); it++) {
        cout << *it << " ";
    }

    
    return 0;
}

Comments