본문 바로가기
백준

[백준] 17298 - 오큰수, C++

by 황인태(intaehwang) 2020. 1. 9.
반응형

https://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

 본 문제는 입력의 크기가 1,000,000이므로 O(n^2)의 연산으로 해결할 수 없다. 따라서, 다른 방법으로 해결해야 하는데 stack을 이용해야 한다. stack을 사용해야 된다는 것은 알았는데, 어떻게 사용해야 할지 도저히 감이 잡히지 않았다. 정답을 보고 해결하였는데 stack에 index를 저장해야 한다.

  1. stack에 index를 저장
  2. index에 해당하는 배열보다 큰 배열의 값이 있을 경우
  3. 정답 배열의 index 번째에 저장하고 stack pop
  4. 없을 경우 stack에 index 저장
  5. stack이 empty가 아닐 때 stack top의 index 번째 정답 배열에 -1 입력
  6. 정답 배열 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <cstdio>
#include <stack>
 
using namespace std;
 
int main() {
    int d[1000000];
    int ans[1000000];
    int t;
    
    scanf("%d"&t);
    for (int i = 0; i < t; i++) {
        scanf("%d"&d[i]);
    }
    
    stack<int> st;
    st.push(0);
    for (int i = 1; i < t; i++) {
        if (st.empty()) st.push(i);
        while (!st.empty() && d[st.top()] < d[i]) {
            ans[st.top()] = d[i];
            st.pop();
        }
        st.push(i);
    }
    while (!st.empty()) {
        ans[st.top()] = -1;
        st.pop();
    }
    for (int i = 0; i < t; i++) {
        printf("%d", ans[i]);
        if (i != t-1printf(" ");
    }
    printf("\n");
    return 0;
}
cs
반응형
Buy me a coffeeBuy me a coffee

댓글