티스토리 뷰

algorithm

[완전탐색 피하기] 덱(deque)

수학소년 2023. 7. 26. 01:47

길이가 N인 배열 arr에서 arr[i-L+1]~arr[i] 중 최소값을 answer[i]이라고 할 때, answer 구하기

(백준 온라인 저지 11003)

arr for문을 돌면서, 0~L-1까지 for문을 또 돌리면서 최소값을 찾음 O(N*L)

var answer = [];
for (var i=0; i<arr.length; i++) {
	var min = arr[i];
	for (var j=i; j>=i-L+1; j--) {
    	if (j<0) continue;
        if (arr[j] < min) {
        	min = arr[j];
        }
    }
    answer.push(min);
}

 

덱은 큐처럼 넣고 빼는데, 양 끝에서 넣고 빼는 구조.

push/pop처럼 unshift/shift

 

일단 arr for문을 돌면서 deque에 넣는다. 넣는데,,

arr[i]는 반드시 최소값 판정에 사용해야 하니까 반드시 넣어야 함.(push)

deque의 뒷부분 부터 검사 하는데,

맨뒤값 보다 arr[i]가 작으면, 앞으로 최대 L턴 동안은 arr[i] 쓸모가 있을지도?

반대로 맨뒤값은 쓸모 없어짐.(최소값을 구하는거니까)

뒤부터 검사하면서 arr[i]가 작으면 계속 pop.

다 쳐냈으면 arr[i] push.

L이라는 길이 제한이 있으니까,

들어올 arr[i] 인덱스 i랑 deque 첫번째 값의 인덱스(arr 있을 적 index) 차이가 L을 벗어나면 shift.

각 최소값은 그때의 deque의 첫번째 값임.

var deque = [];
for (var i=0; i<arr.length; i++) {
    while (deque.length && deque[deque.length-1][0] > arr[i]) {
        deque.pop();
    }

    deque.push([arr[i], i]);
    if (deque[0][1] <= i - L) {
        deque.shift();
    }
    console.log(deque[0][0]);
}

값, 인덱스 둘다 필요하기 때문에, deque에 [값, 인덱스] 통째로 push.

'algorithm' 카테고리의 다른 글

[BFS]  (0) 2023.07.29
[DFS]  (0) 2023.07.28
[완전탐색 피하기] 스택  (0) 2023.07.26
[완전탐색 피하기]부분합  (0) 2023.07.24
Euclidean algorithm  (0) 2022.11.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
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
글 보관함