반응형
리뷰
스택을 활용하여 O(N) 시간복잡도로 푸는 문제
https://www.acmicpc.net/problem/2493
전역 변수
- n : 탑의 개수를 저장할 정수형 변수 n
- lst, ans : 탑의 정보를 저장할 정수형 배열 lst, 각 탑에서 본 결과를 저장할 정수형 배열 ans
함수
없음
문제풀이
- n을 입력 받고 lst 배열에 n개의 탑 정보를 입력 받아준다.
- 스택을 s로 초기화 해주고 다시 n개의 for문을 개행해 준다.
- 스택이 비지 않았고, 스택의 top에 해당하는 인덱스의 탑 높이가 현재 탑보다 낮거나 같으면 pop을 해준다.
- 위 작업을 마친 후 스택이 비어있다면 현재 인덱스의 ans는 0으로, 아니라면 스택의 top인덱스로 저장한다.
- 현재 인덱스를 스택에 추가해 준다. 해당 작업을 계속 반복해 준다.
- 반복문이 종료된 후 1 ~ n번 인덱스의 ans배열에 저장된 값을 공백으로 구분하여 출력해 주면 된다.
참고 사항
스택에는 인덱스 정보가 들어있어야 한다.
탑의 높이를 비교할때만 lst를 참고하여 비교해 주면 된다.
정답 코드
#include<iostream>
#include<stack>
using namespace std;
int n;
int lst[500001], ans[500001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) cin >> lst[i];
stack<int> s;
for (int i = 1; i <= n; i++) {
while (!s.empty() && lst[s.top()] <= lst[i]) s.pop();
if (s.empty()) ans[i] = 0;
else ans[i] = s.top();
s.push(i);
}
for (int i = 1; i <= n; i++) cout << ans[i] << " ";
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[G3] 백준 2812번 크게 만들기 C++ 스택, 문자열, 그리디 알고리즘 (0) | 2024.10.02 |
---|---|
[G5] 백준 6198번 옥상 정원 꾸미기 C++ 스택 (0) | 2024.10.02 |
[G5] 백준 11000번 강의실 배정 C++ 우선순위 큐 (0) | 2024.10.02 |
[G5] 백준 3980번 선발 명단 C++ 백트래킹, 브루트포스 알고리즘 (0) | 2024.10.02 |
[G4] 백준 17298번 오큰수 C++ 스택 (0) | 2024.10.02 |