본문 바로가기
백준/10001 - 15000

[백준] 11003번 : 최솟값 찾기(JAVA)

by lms0806 2021. 10. 31.
728x90
반응형

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

풀이

덱과 배열 1개를 이용하여 풀 수 있습니다.

덱에는 배열의 인덱스 위치만 저장하고 값을 입력받을 때마다, 덱의 마지막값의 위치에 있는 배열을 가져와 비교하면서 제거해주면 됩니다.

또한 i - 덱의 처음값이 l보다 클 경우 맨앞자리를 빼줍니다.

 

소스코드

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int n = Integer.parseInt(st.nextToken()), l = Integer.parseInt(st.nextToken());

		ArrayDeque<Integer> deque = new ArrayDeque<>();
		int[] arr = new int[n];
		
		StringBuilder sb = new StringBuilder();
		st = new StringTokenizer(br.readLine());
		for(int i = 0; i < n; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
			
			while(!deque.isEmpty() && arr[deque.peekLast()] > arr[i]) {
				deque.pollLast();
			}
			
			deque.offer(i);
			
			if(i - deque.peekFirst() >= l) {
				deque.pollFirst();
			}
			
			sb.append(arr[deque.peekFirst()]).append(" ");
		}
		System.out.print(sb);
	}
}
728x90
반응형

댓글