์ต์๊ฐ, ์ต๋๊ฐ ์ฐพ๊ธฐ ๋ฌธ์ ์์ ์ ๋ ฌ์ ์ฌ์ฉํ ์ ์๋ค๋ฉด, ์ฐ์ ์์ ํ๋ฅผ ์๊ฐํ์ธ์
๋ค์ด๊ฐ๋ฉฐ
์๊ฐ๋ณต์ก๋๋ฅผ ์ธก์ ํ๋ ๋ฌธ์ ์ค์์๋ ๊น๋ค๋ก์ด ๋ฌธ์ ๋ค์ด ๋ง์ต๋๋ค. ํนํ ์ ๋ ฌ์ด ํ์ํ ๊ฒฝ์ฐ์ธ๋ฐ, ์ ๋ ฌ์ ๊ธฐ๋ณธ์ ์ผ๋ก NlogN์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค. ํน์ ๋ฌธ์ ์ ์๊ตฌ์ฌํญ์์๋ ์ ์ด๋ N์ ์๊ฐ๋ณต์ก๋๋ฅผ ์๊ตฌํ๋ ๋ถ๋ถ์ด ์์ต๋๋ค. ์ด๋ด ๋ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ฉด logN์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
๋ฌธ์
์ฒ์์๋ ๋ฌธ์ ์์ฒด๊ฐ ์ดํด๋์ง ์์์ต๋๋ค. ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ํํ๋ก ๊ณ ์ ๋ ๊ตฌ๊ฐ์ด ์ด๋ํ๋ฉด์ ๊ทธ ์ค ์ต์๊ฐ์ ์ฐพ๋ ๋ฌธ์ ๋๋ผ๊ตฌ์. 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);
}
}
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DFS] ์ฌ๊ท์ ์คํ์ผ๋ก ๊ฐ๋ณ๊ฒ ๋ฌธ์ ํ๊ธฐ (1) | 2025.05.16 |
---|---|
[์คํ, ํ] ๋ฐฑํธ๋ํน(์ด์ ์ํ ๊ธฐ์ต)์ ์คํ์ ํ์ฉํ์ธ์ (0) | 2025.05.11 |
[๊ธฐ๋ณธ] ํฌ ํฌ์ธํฐ (0) | 2025.03.25 |
[๊ธฐ๋ณธ] ๊ตฌ๊ฐํฉ ์์ฉ (0) | 2025.03.13 |
[๊ธฐ๋ณธ] ์คํ ์๋ฃ๊ตฌ์กฐ ํ์ฉ (0) | 2025.03.10 |
๋๊ธ