리뷰
스택을 활용하여 리스트의 뒤에서부터 순차적으로 순회하며 오큰수를 찾는 문제
https://www.acmicpc.net/problem/17298
전역 변수
없음
함수
없음
문제풀이
- n을 입력 받고 수와 정답을 저장할 벡터lst, result의 크기를 n으로 초기화 해주고 n개의 수를 입력 받아 저장한다.
- 스택을 초기화 해준 뒤에 n - 1부터 0번 인덱스 까지 lst를 반대로 순회해 줄것이다.
- 스택이 비지 않았을 경우 스택의 제일 위 요소와 현재 값을 비교한다.
- 스택의 제일 위 요소가 현재 값보다 작거나 같으면 스택에서 제거해 준다. 이 작업을 반복해 준다.
- 위 작접이 완료된 후 만약 스택이 빈 상태라면 result의 현재 인덱스 값을 -1로 저장한다.
- 만약 스택이 빈 상태가 아니라면 스택의 마지막 요소를 result의 현재 인덱스 값으로 저장한다.
- 이후 스택에 현재 숫자를 추가해 준다.
- 위 작업을 마친 뒤 result에 저장되어 있는 값을 공백으로 나누어 출력해 주면 된다.
참고 사항
처음엔 현재 위치에서 부터 upper_bound를 사용하려 했으나 수열이 정렬된 상태가 아니라 이상한 값이 나왔다.
된다 하더라도 시간 복잡도가 O(NLogN)이므로 스택을 사용한 O(N) 보다 컸다.
그런데도 생각보다 시간이 오래 걸린 것 같다.
정답 코드
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n; cin >> n;
vector<int> lst(n), result(n);
for (int i = 0; i < n; i++) cin >> lst[i];
stack<int> s;
for (int i = n - 1; i >= 0; i--) {
while (!s.empty() && s.top() <= lst[i]) s.pop();
if (s.empty()) result[i] = -1;
else result[i] = s.top();
s.push(lst[i]);
};
for (int i = 0; i < n; i++) cout << result[i] << " ";
}
728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
[G5] 백준 11000번 강의실 배정 C++ 우선순위 큐 (0) | 2024.10.02 |
---|---|
[G5] 백준 3980번 선발 명단 C++ 백트래킹, 브루트포스 알고리즘 (0) | 2024.10.02 |
[P4] 백준 15967번 에바쿰 C++ 세그먼트 트리, 느리게 갱신되는 세그먼트 트리 (0) | 2024.10.01 |
[G5] 백준 5972번 택배 배송 C++ 최단 경로, 다익스트라 (0) | 2024.09.30 |
[G1] 백준 3665번 최종 순위 C++ 위상 정렬 (1) | 2024.09.29 |