PS

BOJ 17298 - 오큰수

728x90

www.acmicpc.net/problem/17298

 

17298번: 오큰수

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.

www.acmicpc.net

 

N 의 최대 크기가 백만이기 때문에, 단순히 이중 포문을 쓰면 당연히 시간초과가 발생한다

그래서, 처음에 N 개의 수들을 벡터에 저장해 둔 뒤, 스택을 이용해서 풀어야 한다

(사실 스택을 쓰는것을, 문제에서 주는 힌트를 보고 스택써야겠구나 생각했다)

 

스택에는, N개의 수가 들어가는게 아니라, N개의 수가 위치한 인덱스 값을 넣는다

비어있는 상태의 스택에서는, 즉 첫번째 인덱스는 반드시 들어가고

스택이 비어있지 않은 상태에서는, 스택의 top 에 담긴 인덱스에 해당하는 수와 다음 차례에 해당하는 수 끼리 비교해서 다음 차례가 더 크다는것은, 오른쪽에 있는 수가 더 크다는 의미가 되므로 조건을 만족하는 상태가 된다

따라서 이때, 답을 갱신해주고, 스택에서 하나씩 빼준다. 

이런식으로 처리를 해주면 답이 나오게 된다.

 

- c++

#include <bits/stdc++.h>
 
using namespace std;
 
int N;
vector<int> vec;
stack<int> st;
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
    
    cin >> N;
    
    for (int i = 0; i < N; ++i) {
        int num;
        cin >> num;
        vec.push_back(num);
    }
    
    vector<int> answer(vec.size(), -1);
    
    for (int i = 0; i < vec.size(); ++i) {
        while(!st.empty() && vec[st.top()] < vec[i]) {
            answer[st.top()] = vec[i];
            st.pop();
        }
        st.push(i);
    }
    
    for (int i = 0; i < answer.size(); ++i) {
        cout << answer[i] << " ";
    }
    
    return 0;
}
cs

 

 

728x90

'PS' 카테고리의 다른 글

BOJ 2933 - 미네랄  (0) 2021.02.07
BOJ 2589 - 보물섬  (0) 2021.02.07
BOJ 2075 - N번째 큰 수  (0) 2021.02.05
BOJ 9328 - 열쇠  (0) 2021.02.05
BOJ 1918 - 후위 표기식  (0) 2021.02.04