https://www.acmicpc.net/problem/11003
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 |
'algorithm > data-structure' 카테고리의 다른 글
boj 4358 생태학 (0) | 2021.01.25 |
---|---|
boj 5639 이진 검색 트리 (0) | 2021.01.24 |
boj 1991 트리 순회 (0) | 2021.01.22 |
boj 2517 달리기 (0) | 2021.01.22 |
boj 3425 고스택 (0) | 2021.01.22 |