N개의 수 A1, A2, ..., AN과 L이 주어진다.
Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다.
자료 구조우선순위 큐덱우선순위 큐를 이용하여 해결하였다. 처음부터 입력을 받으며 우선순위 큐에 해당 값과 인덱스를 넣고, 오름차순으로 만든다.
이제 q.top()을 출력하면 되는데, 해당 값이 현재 인덱스 범위 내인지(q.top().second <= i - l)만 확인하면 된다.
이에 O(nlogn)의 복잡도로 해결할 수 있다.
이렇게 보니 참 쉬운 문제인데, 너무 어렵게 접근해서 오래걸린 것 같다.
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int main()
{
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> q;
int n, l, input;
cin >> n >> l;
for (int i = 0; i < n; i++) {
scanf("%d", &input);
q.push({ input , i });
auto t = q.top();
while (q.top().second <= i - l) q.pop();
printf("%d ", q.top());
}
}