algorithm/data-structure
boj 11003 최솟값 찾기
와이에쓰
2021. 1. 22. 22:51
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
A[i-L+1]~A[i] 중 최솟값을 구하는 문제로 Deque를 이용하여 해결하였습니다.
큐가 비어있을 때는 바로 삽입하면 되고
반복문을 이용하여 삽입하려는 수가 큐의 뒤에있는 수보다 작을때마다 뒤의 값을 제거한 후에 삽입합니다.
만약 A[i-L+1]이 양수가 되면 큐의 앞에있는 수가 제거되었는지 확인하고 제거되지 않았으면 제거합니다.
그럼 큐의 맨앞에 있는 수가 최솟값이므로 ans배열에 넣으면 됩니다.
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Deque; import java.util.LinkedList; import java.util.StringTokenizer; public class Main { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer st; static int list[], ans[]; static int N, L; static void func() { Deque<Integer> dq = new LinkedList<>(); for (int i = 0; i < N; i++) { if (dq.isEmpty()) dq.addLast(list[i]); else { while (true) { if (dq.isEmpty()) break; if (dq.peekLast() > list[i]) dq.removeLast(); else break; } dq.addLast(list[i]); } if (L <= i) { if (dq.peek() == list[i - L]) dq.removeFirst(); } ans[i] = dq.peek(); } } static void print() { StringBuffer sb = new StringBuffer(); for (int i = 0; i < N; i++) { sb.append(ans[i] + " "); } System.out.println(sb.toString()); } static void input() throws Exception { st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); list = new int[N]; ans = new int[N]; L = Integer.parseInt(st.nextToken()); st = new StringTokenizer(br.readLine()); for (int i = 0; i < N; i++) { list[i] = Integer.parseInt(st.nextToken()); } } public static void main(String[] args) throws Exception { input(); func(); print(); } } | cs |