티스토리 뷰

반응형

백준 11003번 최솟값 찾기

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

 

    ● N과 L이 5,000,000이하 이므로 일반적으로 O(nlogn)의 시간복잡도를 가지는 정렬 알고리즘을 사용할 수 없음 

    ● O(n)의 시간 복잡도로 해결해야 하므로 슬라이싱 윈도우를 덱으로 구현하기

    ● 덱의 마지막 위치에서부터 now보다 큰 값은 덱에서 제거

    ● 덱의 마지막 위치에 now값 저장   

     덱의 첫 번째 위치에서부터 L의 범위를 벗어난 값(now index - L <= index)을 덱에서 제거

 

#include<iostream>
#include<deque>
using namespace std;
typedef pair<int, int>Node;

int main() {

	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, L;
	cin >> N >> L;
	deque<Node>mydeque;
	
	for (int i = 0; i < N; i++) {

		int now;
		cin >> now;

		while (mydeque.size() && mydeque.back().first > now) {
			mydeque.pop_back();
		}
		
		mydeque.push_back(Node(now, i));

		if (mydeque.front().second <= i - L) {
			mydeque.pop_front();
		}
		
		cout << mydeque.front().first << ' ';
	}	
}
반응형

'Algorithm > BOJ' 카테고리의 다른 글

[C/C++] 백준 17298번 - 오큰수  (2) 2024.02.28
[C/C++] 백준 1874번 - 스택 수열  (0) 2024.02.28
[C/C++] 백준 1253번 - 좋다  (2) 2024.02.28
[C/C++] 백준 2018번 수들의 합 5  (0) 2024.02.28
[C/C++] 백준 10986번 - 나머지 합  (0) 2024.02.25
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함