쌓고 쌓다

[백준] 최솟값 찾기 11003번 C++ 풀이 본문

알고리즘/백준

[백준] 최솟값 찾기 11003번 C++ 풀이

승민아 2021. 12. 29. 20:54

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

 

11003번: 최솟값 찾기

N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다.

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
using namespace std;
vector<int> v;
deque<pair<int, int>> dq;
int N, L;
int main(void)
{
	cin.tie(0);
	cout.tie(0);
	ios_base::sync_with_stdio(0);

	int num;
	cin >> N >> L;

	for (int i = 0; i < N; i++)
	{
		cin >> num;
		v.push_back(num);
	}

	for (int i = 1; i <= N; i++)
	{
		if (!dq.empty())
		{
			if (dq.front().second < i - L + 1) // dq에 든 첫 원소의 인덱스가 범위에 안속하면 제거
				dq.pop_front();
		}

		while (!dq.empty() && dq.back().first > v[i - 1]) // 뒤에서부터 현재 넣을 원소보다 큰 수들은 제거
			dq.pop_back();
		dq.push_back(make_pair(v[i - 1],i)); // dq의 맨뒤에 삽입 ( 후보가 될 수 있음)
		cout << dq.front().first << " "; // dq의 맨 앞원소는 현재 범위에서의 최솟값임
	}



}

 

Comments