๐Ÿ•๏ธ ICPC Sinchon/Linear Data Structure

[BOJ][C++] ๋ฐฑ์ค€ 17299๋ฒˆ: ์˜ค๋“ฑํฐ์ˆ˜

์„ ๋‹ฌ 2023. 5. 25. 23:28
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/17299

 

17299๋ฒˆ: ์˜ค๋“ฑํฐ์ˆ˜

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ์— ์ˆ˜์—ด A์˜ ์›์†Œ A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

 

ํ’€์ด

๊ฐ ์ˆซ์ž๋“ค์˜ ๊ฐฏ์ˆ˜๋Š” ์ž…๋ ฅ์„ ๋ฐ›๋Š” ์ค‘์— cnt ๋ฒกํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉฐ ๊ตฌํ–ˆ๋‹ค

์ž…๋ ฅ์„ ๋‹ค ๋ฐ›์€ ํ›„์—๋Š” ์ž…๋ ฅ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ ์ˆซ์ž์™€ ํ•ด๋‹น ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ pair๋กœ ๋งŒ๋“ค์–ด์„œ f ๋ฒกํ„ฐ์— ์ €์žฅํ•ด์ค€๋‹ค

 

์ด์ œ f๋ฒกํ„ฐ๋ฅผ ๊ฑฐ๊พธ๋กœ ๋Œ๋ฉด์„œ ์Šคํƒ์„ ์ด์šฉํ•ด ์˜ค๋“ฑํฐ์ˆ˜๋ฅผ ๊ตฌํ•ด์ค€๋‹ค

์Šคํƒ์•ˆ์— ์žˆ๋Š” ์ˆซ์ž๋“ค์€ ๋ณธ์ธ๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์ˆซ์ž์ด๋ฏ€๋กœ ํ•ด๋‹น ์Šคํƒ ๋‚ด์—์„œ

๋ณธ์ธ์˜ ๋นˆ๋„๋ณด๋‹ค ๋” ํฐ ๋นˆ๋„๋ฅผ ๊ฐ€์ง„ ์ˆ˜๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ popํ•œ๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ๊ตฌํ•œ ์˜ค๋“ฑํฐ์ˆ˜๋Š” ngf ๋‹ต๋ฒกํ„ฐ์— ๋„ฃ์–ด์ค€๋‹ค.

๋‚˜์˜ ๊ฒฝ์šฐ ๋‹ต๋ฒกํ„ฐ๋ฅผ ์–ด์ฐจํ”ผ ๊ฑฐ๊พธ๋กœ ์ถœ๋ ฅํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ๋„ ์Šคํƒ์„ ์‚ฌ์šฉํ•ด์ฃผ์—ˆ๋‹ค.

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

typedef pair<int,int> ci;

int main() {
    vector<ci> f;
    vector<int> cnt(1000001, 0);
    stack<ci> s;
    stack<int> ngf;
    
    // ์ž…๋ ฅ
    int n, input;
    cin >> n;
    for(int i=0; i<n; i++) {
        cin >> input;
        cnt[input]++;
        f.push_back({input, 0});
    }
    
    // ์ž…๋ ฅ์— ํ•ด๋‹นํ•˜๋Š” ์ˆ˜๋“ค์˜ ๊ฐฏ์ˆ˜๋„ ๊ฐ™์ด ๋„ฃ์–ด์ฃผ๊ธฐ
    for(int i=0; i<n; i++) {
        input = f[i].first;
        f[i] = {input, cnt[input]};
    }
    
    // ์Šคํƒ์„ ์ด์šฉํ•˜์—ฌ ์˜ค๋“ฑํฐ์ˆ˜ ๊ตฌํ•˜๊ธฐ
    s.push({-1, 1000001});
    for(int i=f.size()-1; i>=0; i--) {
        while(f[i].second >= s.top().second) {
            s.pop();
        }
        ngf.push(s.top().first);
        s.push(f[i]);
    }
    
    // ์ถœ๋ ฅ
    while(!ngf.empty()) {
        cout << ngf.top() << " ";
        ngf.pop();
    }
    
    return 0;
}
๋ฐ˜์‘ํ˜•