티스토리 뷰

알고리즘/백준

17298번 오큰수

글을 쓰는 개발자 2020. 12. 1. 20:40
반응형

문제: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^2이 나오기 때문이다. 아래의 코드는 시간초과로 틀렸던 코드이다.

 

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
37
38
39
40
41
#include<iostream>
#include<vector>
#include<cmath>
#include<stack>
#include<deque>
using namespace std;
 
int main()
{
    int vol;
    cin >> vol;
    deque<int> val;
    deque<int> container;
    int tmp;
    for (int i = 0; i < vol; i++)
    {
        cin >> tmp;
        val.push_back(tmp);
    }
    for (int i = 0; i < vol; i++)
    {
        int look = val.front();
        val.pop_front();
        while (val.size()>0&&look >= val.front())
        {
            container.push_back(val.front());
            val.pop_front();
        }
        if (val.size() != 0)
        {
            cout << val.front() << " ";
        }
        else
        {
            cout << -1 << " ";
        }
        auto it = val.insert(val.begin(), container.begin(), container.end());
        container = deque<int>();
        
    }
}
cs

이 문제의 접근법은 Stack의 활용에 있다. 접근 방법은 처음 원소는 비교할 대상이 없으니 우선 스택에 push하고 다음 차례부터는 스택의 top의 위치에 해당하는 값이 지금 차례의 값보다 처음으로 작을때 그 값을 저장하고 확인된 스택 값을 pop하는 형식이다.

 

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
37
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
 
int main(int argc, char *argv[]) 
    int n; 
    int num;
    vector<int> v;
    stack<int> s;
 
    scanf("%d"&n);
    
    for (int i = 0; i < n; i++) {
        scanf("%d"&num);
        v.push_back(num);
    }
    
    vector<int> ans(v.size(), -1); 
 
    for (int i = 0; i < v.size(); i++) { 
        while (!s.empty() && v[s.top()] < v[i]) { 
            ans[s.top()] = v[i]; 
            s.pop(); 
        } 
        s.push(i); 
    } 
 
    for (int x : ans) {
        cout << x << " ";
    }
    
    return 0;
}
cs

위의 코드는 다음 블로그에서 참고했다.

j3sung.tistory.com/241

 

[C++] 백준 17298번 오큰수

스택 문제입니다. A의 수열이 있을 때 Ai의 오른쪽에는 경우 Ai+1 ~ Ai+n가 있습니다. Ai+1 ~ Ai+n에서 Ai와 가장 가까운 Ai보다 큰 수를 구하면 됩니다. 없을 시에 -1을 출력합니다. vecot v에는 입력 받은

j3sung.tistory.com

 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

합분해 2225번 백준  (0) 2020.12.02
제곱수의 합 1699번 백준  (0) 2020.12.02
1,2,3 더하기 5 15990번 백준  (0) 2020.12.02
17299번 오등큰수  (0) 2020.12.01
10799번 쇠막대기 파이썬  (0) 2020.12.01
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함