백준 [17299] "오등큰수"

Kimbab1004·2024년 7월 18일
0

Algorithm

목록 보기
53/102

오큰수 문제와 상당히 유사했던 문제였다. 해결법은 현재 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;
}

0개의 댓글