공부공간

BOJ - 11003 ) 최솟값 찾기 본문

알고리즘/구현,시뮬

BOJ - 11003 ) 최솟값 찾기

개발자가될수있을까? 2021. 3. 10. 21:51

 


www.acmicpc.net/problem/11003

 

1717번: 집합의 표현

첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는

www.acmicpc.net


배열을 O(n)탐색하면서 현재 값보다 큰 값은 빼주고, index가 범위 밖에 있는것도 빼준다.

 


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.StringTokenizer;

public class 최솟값찾기 {
	
	public static void main(String[] args) throws IOException {
	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int L = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine()," ");
		StringBuilder sb = new StringBuilder();
		ArrayDeque<Integer> dq = new ArrayDeque<>();
		int arr[] = new int[N];for(int i=0;i<N;i++)arr[i] = Integer.parseInt(st.nextToken());
		for(int i=0;i<N;++i) {
			while(!dq.isEmpty()&&dq.peekFirst()<=i-L) dq.removeFirst();
			while(!dq.isEmpty()&&arr[dq.peekLast()]>=arr[i]) dq.removeLast();
			dq.offer(i);
			sb.append(arr[dq.peek()]+" ");
		}
		bw.write(sb.toString());
		bw.flush();bw.close();

	}

}

'알고리즘 > 구현,시뮬' 카테고리의 다른 글

BOJ - 1655 ) 가운데를 말해요  (0) 2021.06.09
BOJ - 2170 ) 선 긋기  (0) 2021.06.02
BOJ - 18870 ) 좌표압축  (0) 2020.11.24
BOJ - 14719 ) 빗물  (0) 2020.10.26
BOJ - 17837 ) 새로운게임 2  (0) 2020.10.16
Comments