- 대표적인 슬라이딩 윈도우 문제
- 매번 새로운 창문 안에서의 최소값을 출력해야 하는 문제
- 풀이 과정
- i = 0 : [ 1(0) ]
- i = 1 : [ 1(0), 5(1) ]
- i = 2 : [ 1(0), 5(1), 2(2) ]
- i = 3 :
1(0) [ 5(1), 2(2), 3(3) ]
우선순위큐에서 가장 최소값(top)이 1(0) 인데 이는 범위를 벗어났으므로 pop
- i = 4 : [ 5(1), 2(2), 3(3), 6(4) ]
- i = 5 :
2(2) [ 5(1), 3(3), 6(4), 2(5) ]
우선순위큐에서 가장 최소값(top)이 2(2) 인데 이는 범위를 벗어났으므로 pop
- i = 6 : [ 5(1), 3(3), 6(4), 2(5), 3(6) ]
- i = 7 : [ 5(1), 3(3), 6(4), 2(5), 3(6), 7(7) ]
- i = 8 :
2(5) [ 5(1), 3(3), 6(4), 3(6), 7(7), 3(8) ]
우선순위큐에서 가장 최소값(top)이 2(5) 인데 이는 범위를 벗어났으므로 pop
- i = 9 : [ 5(1), 3(3), 6(4), 3(6), 7(7), 3(8), 5(9) ]
- i = 10 : [ 5(1), 3(3), 6(4), 3(6), 7(7), 3(8), 5(9), 2(10) ]
- i = 11 : [ 5(1), 3(3), 6(4), 3(6), 7(7), 3(8), 5(9), 2(10), 6(11) ]
#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
#include <queue>
using namespace std;
struct A {
int data;
int pos;
};
struct cmp {
bool operator()(const A& a, const A& b) {
return a.data > b.data;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, L;
cin >> N >> L;
vector<int> arr(N);
for (int i = 0; i < N; ++i)
cin >> arr[i];
priority_queue<A, vector<A>, cmp> pq;
for (int i = 0; i < N; ++i) {
pq.push({ arr[i], i });
int pos = pq.top().pos;
while (pos < i - L + 1) {
pq.pop();
pos = pq.top().pos;
}
cout << pq.top().data << ' ';
}
return 0;
}