본문 바로가기
Algorithm/BOJ

[BOJ]17299번: 오등큰수(c++)

by HBGB 2020. 4. 21.

https://www.acmicpc.net/problem/17299

 

17299번: 오등큰수

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

www.acmicpc.net

 

 

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <vector>
#include <stack>
 
using namespace std;
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    const int MAX = 1000000;
 
    // 입력, 등장횟수 F벡터 만들기
    int n;
    cin >> n;
    vector<int> input(n);
    vector<int> F(MAX + 10);
    for (int i = 0; i < n; i++)
    {
        cin >> input[i];
        F[input[i]]++;
    }
 
    // 스택 : 오등큰수가 되는 수
    stack<int> s;
    vector<int> ngf(n);
    for (int i = n - 1; i >= 0; i--)
    {
        // top이 input[i]의 오등큰수가 아니면 stack pop
        while (!s.empty() && F[input[i]] >= F[input[s.top()]])
        {
            s.pop();
        }
 
        // 스택이 비었다 : input[i]의 오등큰수가 없음
        if (s.empty())
        {
            ngf[i] = -1;
        }
        // top이 input[i]의 오등큰수
        else
        {
            ngf[i] = input[s.top()];
        }
 
        s.push(i);
    }
 
    for (int i = 0; i < n; i++)
    {
        cout << ngf[i] << ' ';
    }
 
    return 0;
}
Colored by Color Scripter

 

오큰수 문제와 거의 비슷하다.

 

 

TIP

마찬가지로 스택에 넣을 수의 기준을 잡자.

1. "오등큰수를 아직 찾지 못한 수"를 스택에

2. "오등큰수"를 스택에

 

이번엔 2번 방식으로 풀어보았다. 

1번 방식으로 문제를 푼다면,

for문이 끝나고 스택에 쌓여있는 "오등큰수를 아직 찾지 못한수"의 ngf를 -1 처리 해주면 된다.

(오큰수 문제 풀이 참고)

 

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ]1149번: RGB거리(c++)  (0) 2020.04.22
[BOJ]15988번: 1, 2, 3 더하기 3(c++)  (0) 2020.04.22
[BOJ]17298번: 오큰수(c++)  (0) 2020.04.21
[BOJ]10799번: 쇠막대기(c++)  (0) 2020.04.21
[BOJ]17413번: 단어 뒤집기 2(c++)  (0) 2020.04.20

댓글