우보천리 개발

[백준11003] 최솟값 찾기 Java 본문

알고리즘/Do it! 알고리즘 코딩테스트

[백준11003] 최솟값 찾기 Java

밥은답 2023. 8. 14. 22:59
반응형

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

 

package Chapter1;

import java.io.*;
import java.util.*;

public class BJ11003 {

    // Node는 인덱스와 해당 인덱스의 값을 갖고 있음
    static class Node {
        public int index;
        public int value;

        public Node(int index, int value) {
            this.index = index;
            this.value = value;
        }
    }

    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());
        Deque<Node> dq = new ArrayDeque<>();

        for (int i=0; i<n; i++) {
            // 다음 저장 할 숫자
            int num = Integer.parseInt(st.nextToken());
            // Deque에 요소가 있는데, 제일 마지막에 있는 값이 새로 들어오는 값보다 크다면
            // 최소값을 구하려는 우리에게는 더 이상 필요없기 때문에 Deque에서 제거해준다
            while (!dq.isEmpty() && dq.getLast().value > num) {
                dq.removeLast();
            }
            // 더 작은 값은 Deque에 들어온다(맨뒤로)
            // 그렇게 되면 자연스럽게 Deque는 오름차순으로 정렬이 되기 시작한다
            // 즉 최소값은 Deque 안에 있는 원소를 출력하면 된다
            dq.offer(new Node(i, num)); // dq.addLast() 하면 시간초과

            // 하지만 윈도우의 크기는 3개여야 함.
            // 즉 맨 앞의 원소의 인덱스는 (맨 뒤 - 맨 앞)의 값보다 작아야함
            // 그래서 맨 첫 원소를 제거한다
            if (dq.getFirst().index <= i-l) {
                dq.removeFirst();
            }
            bw.write(dq.getFirst().value + " ");
        }
        bw.flush();
        bw.close();
    }
}
반응형

'알고리즘 > Do it! 알고리즘 코딩테스트' 카테고리의 다른 글

[백준2164] 카드2 Java  (0) 2023.08.17
[백준1874] 스택 수열 Java  (0) 2023.08.17
[백준12891] DNA 비밀번호 Java  (0) 2023.08.14
[백준1253] 좋다 Java  (0) 2023.08.13
[백준1940] 주몽 Java  (0) 2023.08.12
Comments