슬라이딩 윈도우 예제 - 2
문제 분석

손으로 풀어보기




슈도코드
코드 구현 - 파이썬
코드 구현 - 자바
Last updated





Last updated
n(데이터 개수), l(최솟값을 구하는 범위)
myDeque(데이터를 담을 덱 자료구조)
now(주어진 숫자 데이터를 가지는 리스트)
for n 반복: # now 리스트를 탐색(now[i]를 현재 값으로 세팅)
덱의 마지막 위치에서부터 현재 값보다 큰 값은 덱에서 제거
덱의 마지막 위치에 현재 값 저장
덱의 1번째 위치에서부터 l의 범위를 벗어난 값(now index - l <= index)을 덱에서 제거
덱의 1번쨰 데이터 출력import sys
from collections import deque
class Node:
def __init__(self, index, value):
self.index = index
self.value = value
input = sys.stdin.readline
n, l = map(int, input().split())
myDeque = deque()
now = list(map(int, input().split()))
result_list = []
# 새로운 값이 들어올 때마다 정렬 대신 현재 수보다 큰 값을 덱에서 제거해 시간 복잡도를 줄인다.
for i in range(n):
while myDeque and myDeque[-1].value > now[i]: # 뒤에서 앞으로 가면서 현재 값보다 큰 값을 제거한다.(가장 작은 수가 될 가능성이 없다.)
myDeque.pop()
myDeque.append(Node(i, now[i])) # 노드 추가
if myDeque[0].index <= i - l: # 가장 앞의 index가 범위(l)를 벗어나면 가장 앞의 노드를 제거한다.
myDeque.popleft()
result_list.append(str(myDeque[0].value))
print(" ".join(result_list))import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
static class Node {
int index;
int num;
public Node(int index, int num) {
this.index = index;
this.num = num;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Deque<Node> myDeque = new LinkedList<>();
int n = Integer.parseInt(st.nextToken());
int l = Integer.parseInt(st.nextToken());
int[] now = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
now[i] = Integer.parseInt(st.nextToken());
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
while (!myDeque.isEmpty() && myDeque.peekLast().num > now[i]) {
myDeque.pollLast();
}
myDeque.offer(new Node(i, now[i]));
if (myDeque.peekFirst().index <= i - l) {
myDeque.pop();
}
sb.append(myDeque.peekFirst().num).append(" ");
}
System.out.println(sb);
}
}