코딩테스트/c++

오큰수 구하기 (백준 - 17298번)

웅드 2023. 6. 30. 20:28

1. 손으로 풀어보기

2. 코드 구현하기

#include <iostream>
#include <string>
#include <vector>
#include <stack>

using namespace std;

int main(){
    int N;
    cin>>N;
    vector<int> A(N,0);
    vector<int> result(N,0);
    
    for(int i=0; i<N; i++){
        cin >> A[i];
    }
    
    stack<int> aStack;
    aStack.push(0); // 스택에 0 push
    
    for(int i=1; i<N;i++){
        //스택이 비지 않았고, a[0] < a[1] , a[1] < a[2] ...
        while(!aStack.empty() && A[aStack.top()]<A[i]){
            //result 배열에 스택 top 값인 0 위치에 배열 a의 값을 넣어준다.
            result[aStack.top()] = A[i];
            aStack.pop();
        }

        aStack.push(i); // 1을 넣어서 그 다음
    }
    //맨 마지막 값은 값을 비교할 수 없기 때문에 -1을 출력해야한다.
    //또 값이 들어있으면 a[0] < a[1]일 때의 조건을 수행 하지 못한 것이기 때문에 -1을 출력해야한다.
    //한개가 아니라 여러 인덱스의 값이 존재할 수 있기 때문에 if가 아닌 while로 해주어야한다.
    while(!aStack.empty()){
        result[aStack.top()] = -1;
        aStack.pop();
    }
    
    for(int i=0; i<N; i++){
        cout << result[i] << endl;
    }
}

 

출처) 백준 , Do it 코딩테스트

반응형