이번 문제는 스택을 활용하여 해결하는 문제였다. 시간 제한을 보고 시간이 부족하겠다고 생각은 했지만 우선은 스스로 풀어보기로 했다.
#include <iostream>
#include <stack>
#define MAX 500001
using namespace std;
int n;
int top;
stack<int> lazer;
int result[MAX];
void Input(){
cin>>n;
for(int i=0; i<n; i++){
cin>>top;
lazer.push(top);
}
}
void Solution(){
for(int i=n-1; i>=0; i--){
stack<int> test = lazer;
int maxi=lazer.top();
for(int j=i-1; j>=0; j--){
test.pop();
if(test.top()>=maxi){
result[i]=j+1;
break;
}
}
lazer.pop();
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Input();
Solution();
for(int i=0; i<n; i++){
cout<<result[i]<<" ";
}
cout<<endl;
return 0;
}
예상대로 시간초과라는 결과를 얻었다.
구글링을 통해 시간을 줄여 해결할 수 있는 코드를 참고하여 다시 작성하였다.
#include <iostream>
#include <stack>
#include <vector>
#define MAX 500001
using namespace std;
int n;
int arr[MAX];
stack<pair<int, int>> tops;
void Input(){
cin>>n;
for(int i=1; i<=n; i++){
cin>>arr[i];
}
}
void Solution(){
for(int i=1; i<=n; i++){
while(!tops.empty()){
if(tops.top().second>arr[i]){
cout<<tops.top().first<<" ";
break;
}
tops.pop();
}
if(tops.empty()){
cout<<0<<" ";
}
tops.push({i, arr[i]});
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Input();
Solution();
return 0;
}
시간을 초과하지 않고 해결된 것을 확인할 수 있다.
오랜만에 알고리즘 문제를 풀어서 익숙하지 않은 기분을 느꼈다. 다시 꾸준히 알고리즘 문제를 풀어야겠다.