[ 백준 17298 ] 오큰수 : C++ 풀이
이분탐색도 생각해보고, 뒤에서부터 진행도 생각해봤는데 도저히 감이 잡히질 않아서 주제를 봤더니 스택문제였습니다.
[ 백준 17298 ] 오큰수 : C++ 풀이
나의 접근
이분탐색도 생각해보고, 뒤에서부터 진행도 생각해봤는데 도저히 감이 잡히질 않아서 주제를 봤더니 스택문제였습니다…
스택의 특징을 아직 잘 몰라서 실수를 했는데, 스택이 사용될 수 있는 상황은 다음과 같습니다.
현재 문제 상황이 선형적이지만, 여태까지 내가 “탐색”했던 정보들을 바탕으로 판단해야할 때,
혹은 탐색했지만 정답을 찾지못한 정보들을 모아두었다가 나중에 일괄적으로 문제를 해결할 수 있을 때,
그 외 느낌상으로 모아두었다가 해결할 수 있을 것 같을 때
한번 쯤 생각해보면 좋을 것 같습니다. 스택..실제로 활용 문제를 실전풀이로 할 때 상당히 어려운 것 같습니다.
알고리즘
현재 수를 보고 다음 수를 본다, 다음 수가 더 크다면, 기본적으로 현재 수의 NGE는 다음 수이다.
만약 다음 수가 더 작다면, 현재수를 push 하고 다음 수를 본다.
1의 과정 중, 다음 수가 현재수보다 크다면, 현재 수의 NGE는 다음 수 이다, 또한 스택이 비지 않았을 때, top이 현재 시점의 다음 수보다 작을 경우, 해당 수의 NGE도 현재 시점의 다음 수이다.
소스코드
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
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int main() {
cout.tie(0); cin.tie(0)->sync_with_stdio(0);
int n; cin >> n;
vector<int> arr(n);
vector<int> ans(n, -1);
stack<int> st;
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
for (int i = 0; i < n - 1; ++i) {
if (arr[i + 1] > arr[i]) {
ans[i] = arr[i + 1];
while (!st.empty() && arr[st.top()] < arr[i + 1]) {
ans[st.top()] = arr[i + 1];
st.pop();
}
}
else if (arr[i + 1] <= arr[i]) {
st.push(i);
}
}
for (int t : ans) {
cout << t << ' ';
}
}
This post is licensed under CC BY 4.0 by the author.