오큰수 문제와 상당히 유사했던 문제였다. 해결법은 현재 Ai가 수열 A에서 등장한 횟수를 cnt 배열에서 카운팅하는 방식만 추가하면 되는 간단한 문제였는데 오큰수에서 시간 복잡도 개선을 위해 매 입력마다 즉각 계산하는 방식에 사로잡혀 오등큰수 문제 해결에 어려움을 겪었다.
전체를 입력받고 천천히 해결한다면 쉽게 해결 할 수 있는 문제였다.
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#define endl "\n"
using namespace std;
int n,a;
int s = 0;
int check[1000001] = { 0 };
int main() {
cin >> n;
stack<pair<int,int>> s;
vector<int> result(n, -1);
for (int i = 0; i < n; i++) {
cin >> a;
check[a]++;
if (s.empty()) s.push({a,i});
else {
if (check[a] > check[s.top().first]) {
while (check[a] > check[s.top().first]) {
result[s.top().second] = a;
s.pop();
}
s.push({ a,i });
}
else {
s.push({a,i});
}
}
}
for (int i = 0; i < result.size(); i++) {
cout << result[i] << " ";
}
return 0;
}
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
#define MAX 1000000
int main() {
cin.tie(0);
ios_base::sync_with_stdio(0);
int n;
cin >> n;
vector<int> arr(n);
vector<int> ngf(n, -1);
vector<int> cnt(MAX + 1, 0);
stack<int> st;
// 배열 입력 및 빈도 계산
for (int i = 0; i < n; i++) {
cin >> arr[i];
cnt[arr[i]]++;
}
// 오등큰수 계산
for (int i = 0; i < n; i++) {
while (!st.empty() && cnt[arr[st.top()]] < cnt[arr[i]]) {
ngf[st.top()] = arr[i];
st.pop();
}
st.push(i);
}
// 결과 출력
for (int i = 0; i < n; i++) {
cout << ngf[i] << ' ';
}
cout << '\n';
return 0;
}