[C++ / Algorithm] 백준 17298번 오큰수 #20
1. 오큰수
1-1. 문제
크기가 N인 수열 A = A1, A2, …, AN이 있다. 수열의 각 원소 Ai에 대해서 오큰수 NGE(i)를 구하려고 한다.
Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다.
그러한 수가 없는 경우에 오큰수는 -1이다.
예를 들어, A = [3, 5, 2, 7]인 경우 NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1이다.
A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, NGE(2) = 8, NGE(3) = 8, NGE(4) = -1이다.
1-2. 입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, …, AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
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
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
int main() {
int seriesLength;
vector<int> series;
stack<int> results;
cin >> seriesLength;
series.begin();
for (int n = 0; n < seriesLength; n++) {
int element;
cin >> element;
series.push_back(element);
}
for (int index = 0; index < series.size(); index++) {
while (true) {
if (results.empty()) {
results.push(index);
break;
}
int topIndex = results.top();
if (series[topIndex] >= series[index]) {
results.push(index);
break;
}
else {
results.pop();
series[topIndex] = series[index];
}
}
}
while (!results.empty()) {
series[results.top()] = -1;
results.pop();
}
for (auto element : series) {
cout << element << " ";
}
}
1
2
22
2 6 1 7 9 4 1 3 4 6 8 5 3 6 2 4 8 2 1 3 7 8
1
6 7 7 9 -1 6 3 4 6 8 -1 6 6 8 4 8 -1 3 3 7 8 -1
This post is licensed under
CC BY 4.0
by the author.