코테/백준

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

imname1am 2023. 6. 11. 22:57
반응형

🔺 문제

 

11003번: 최솟값 찾기

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

www.acmicpc.net

 

 

🔺 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.util.*;
import java.io.*;
 
public class Main {
    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());   // 최소값 구하는 범위 (= 슬라이딩 윈도우 크기)
        
        Deque<Node> myDeque = new LinkedList<>();
 
        st = new StringTokenizer(br.readLine()," ");
        for(int i = 0 ; i < N ; i++) {
            int now = Integer.parseInt(st.nextToken());
 
            // 덱 마지막 위치에서 now보다 큰 값은 덱에서 제거
            while(!myDeque.isEmpty() && myDeque.getLast().val > now) {
                myDeque.removeLast();
            }
            
            myDeque.addLast(new Node(now, i));  // 덱의 마지막 위치에 now값 저장
            
            // 범위에서 벗어난 값은 덱에서 제거 (범위 : i - L + 1 ~ i)
            if(myDeque.getFirst().idx <= i - L) {
                myDeque.removeFirst();
            }
            
            bw.write(myDeque.getFirst().val + " "); // 덱의 첫 번째 데이터(=최소값) 출력
        }
        
        bw.flush();
        bw.close();
    }
    
    // 덱에 저장할 노드 클래스
    static class Node {
        public int val;
        public int idx;
        
        Node(int val, int idx) {
            this.val = val;
            this.idx = idx;
        }
    }
}
cs
✅ 해결 아이디어
✔ 슬라이딩 윈도우를 덱으로 구현
- 새로운 값 들어올 때마다 정렬 대신, 현재 수보다 큰 값을 덱에서 제거

 

 


🔺 다른 풀이들

- 최고의 풀이.. (복습용)

 

[BOJ] 백준 11003번 최솟값 찾기 (Java)

#11003 최솟값 찾기 난이도 : 플레 5 유형 : 슬라이딩 윈도우 / Deque 11003번: 최솟값 찾기 N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로

loosie.tistory.com

 

 

- Node 클래스를 만드는 대신 int 배열을 만들어 사용하셨다. 과정 설명도 짱

 

(JAVA) 백준 11003번 : 최솟값 찾기 --- [슬라이딩 윈도우]

https://www.acmicpc.net/problem/11003 11003번: 최솟값 찾기 N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 A

maivve.tistory.com

 


💬 느낀 점

개념 자체는 어렵지 않은데..

직접 구현해보라면 아직은 못 할 것 같다..

복습혀야지,,,

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ Do it 알고리즘 코딩테스트 자바편

 

반응형