๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[์šฐ์„ ์ˆœ์œ„ ํ] ์ตœ์†Ÿ๊ฐ’ or ์ตœ๋Œ“๊ฐ’ ์ฐพ๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜(feat. deque)

by ์„œ์•„๋ž‘๐Ÿ˜ 2025. 4. 13.

 

 

์ตœ์†Ÿ๊ฐ’, ์ตœ๋Œ“๊ฐ’ ์ฐพ๊ธฐ ๋ฌธ์ œ์—์„œ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ƒ๊ฐํ•˜์„ธ์š”

 

๋“ค์–ด๊ฐ€๋ฉฐ

์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ธก์ •ํ•˜๋Š” ๋ฌธ์ œ ์ค‘์—์„œ๋Š” ๊นŒ๋‹ค๋กœ์šด ๋ฌธ์ œ๋“ค์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ •๋ ฌ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์ธ๋ฐ, ์ •๋ ฌ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ NlogN์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ํŠน์ • ๋ฌธ์ œ์˜ ์š”๊ตฌ์‚ฌํ•ญ์—์„œ๋Š” ์ ์–ด๋„ N์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋• ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด logN์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฌธ์ œ

๋ฐฑ์ค€ 11003

 

์ฒ˜์Œ์—๋Š” ๋ฌธ์ œ ์ž์ฒด๊ฐ€ ์ดํ•ด๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ํ˜•ํƒœ๋กœ ๊ณ ์ •๋œ ๊ตฌ๊ฐ„์ด ์ด๋™ํ•˜๋ฉด์„œ ๊ทธ ์ค‘ ์ตœ์†Œ๊ฐ’์„ ์ฐพ๋Š” ๋ฌธ์ œ๋”๋ผ๊ตฌ์š”. N์˜ ์ตœ๋Œ€ ๋ฒ”์œ„๊ฐ€ 5,000,000์ด๋ฏ€๋กœ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ๋ฌธ์ œ๋ฅผ ๋‘๊ฐ€์ง€ ํŒŒํŠธ๋กœ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ๊ตฌ๊ฐ„์ด ์ด๋™ํ•จ์— ๋”ฐ๋ผ ์ตœ์†Œ๊ฐ’ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ์ž‘์—…, ๋‘ ๋ฒˆ์งธ๋Š” ๊ตฌ๊ฐ„์ด ์ด๋™ํ•จ์— ๋”ฐ๋ผ ๊ธฐ์กด ์ตœ์†Œ๊ฐ’์„ ๋ฒ„๋ฆฌ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ํ์™€ ๋ฑ(deque)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ •๋ ฌํšจ๊ณผ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

ํ’€์ด1(์šฐ์„ ์ˆœ์œ„ ํ)

์šฐ์„ ์ˆœ์œ„ ํ๋Š” ํž™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๊ฐ€ ์„ค์ •ํ•œ ๊ธฐ์ค€์— ๋งž๊ฒŒ ์ž๋™์œผ๋กœ ์ •๋ ฌ๋˜๋ฉด์„œ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ์†Œ๊ฐ’ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ์ž‘์—…์€ ์ž๋™์œผ๋กœ ๋˜๋ฉฐ, ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๊ฐ€ ์ด๋™ํ•จ์— ๋”ฐ๋ฅธ ๊ธฐ์กด ์ตœ์†Œ๊ฐ’ ๋ฒ„๋ฆฌ๋Š” ์ž‘์—…๋งŒ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜
1. ์ธ๋ฑ์Šค์™€ ๊ฐ’์„ ๊ฐ–๋Š” Item ๋ฐ์ดํ„ฐ ๋งŒ๋“ค๊ณ , ์ตœ์†Œ๊ฐ’ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ƒ์„ฑ
2. N๋งŒํผ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ’์„ ํ์— ๋„ฃ๊ณ , ํ˜„์žฌ ํ ์ตœ์†Œ๊ฐ’์˜ ์ธ๋ฑ์Šค๊ฐ€ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์‚ญ์ œ
3. ํ์˜ ์ตœ์†Ÿ๊ฐ’ ์ถœ๋ ฅ

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

struct Item {
    int index;
    int value;

    bool operator<(const Item& other) const {
        return value > other.value; // ์ž‘์€ priority๊ฐ€ top์—
    }
};

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    
    int N, L;
    cin >> N >> L;

    priority_queue<Item> pq;

    int num = 0;
    for (int i = 0; i < N; i++)
    {
        cin >> num;
        pq.push(Item{ i, num });

        auto currentMinItem = pq.top();
        const int start = i - L + 1;
        while (currentMinItem.index < start)
        {
            pq.pop();
            currentMinItem = pq.top();
        }

        printf("%d ", currentMinItem.value);
    }
}

 

ํ’€์ด2(deque)

๋ฑ์€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ push์™€ pop์ด ๋˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋ฑ์œผ๋กœ๋„ ์ตœ์†Ÿ๊ฐ’ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•˜๋ฉด์„œ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜
1. N๋งŒํผ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ฑ์˜ ๋งจ ๋ ๊ฐ’์ด ํ˜„์žฌ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๋งจ ๋ ๊ฐ’ ์ œ๊ฑฐ(๋ฑ์˜ ์ฒ˜์Œ ๋ถ€๋ถ„์ด ์ตœ์†Ÿ๊ฐ’)
2. ํ˜„์žฌ ๊ฐ’ ๋ฑ์˜ ๋์œผ๋กœ ์‚ฝ์ž…
3. ํ˜„์žฌ ๋ฑ์˜ ๋งจ ์•ž ๋ฐ์ดํ„ฐ(์ตœ์†Ÿ๊ฐ’ ๋ฐ์ดํ„ฐ)๊ฐ€ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ œ๊ฑฐ
4. ๋ฑ์˜ ๋งจ ์•ž ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    
    int N, L;
    cin >> N >> L;
    deque<pair<int,int>> dq;	// idx, value

    int num;
    for (int i = 0; i < N; i++)
    {
        cin >> num;

        while (!dq.empty() && dq.back().second > num)
        {
            dq.pop_back();
        }

        dq.push_back({ i, num });

        const int start = i - L + 1;
        if (dq.front().first < start)
            dq.pop_front();

        printf("%d ", dq.front().second);
    }
}

๋Œ“๊ธ€