Baekjoon Review
[Gold 5] 2493 탑
hanseongbugi
2024. 10. 10. 18:21
https://www.acmicpc.net/problem/2493
이 문제는 오큰수 문제와 유사한 방식으로 해결하였다.
스택을 사용해서 문제를 접근하였다.
오큰수는 뒤에서부터 스택에 값을 넣고
스택의 top이 현재 검색할 값보다 클때까지 스택을 pop한다.
이후, 스택의 top을 오큰수로 지정한 것을 알 수 있다.
위 방식을 반대로 생각하면
배열의 앞에서부터 스택의 요소로 집어 넣으면
배열의 가장 앞에 있는 요소는 스택이 비어 있으므로 0이 될 것이다.
이후 스택에 가장 앞에 있는 요소를 넣고, 그 다음 배열의 요소를 통해
스택의 top과 비교해 스택의 top이 작으면 스택에서 pop한다.
#include <iostream>
#include <stack>
using namespace std;
int N;
int tops[500001];
stack<pair<int,int>> s;
int answer[500001];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin>>N;
for(int i = 0;i<N;i++)
cin>>tops[i];
// 6 9 5 7 4
// 주어진 순서의 반대 방향으로 신호 발사
for(int i = 0;i<N;i++){
while(!s.empty() && s.top().first <= tops[i])
s.pop();
if(s.empty())
answer[i] = 0;
else
answer[i] = s.top().second;
s.push({tops[i],i + 1});
}
for(int i = 0;i<N;i++)
cout<<answer[i]<<' ';
}