슬라이딩 윈도우 기법
정의
슬라이딩 윈도우는 일정 크기의 ‘윈도우’를 데이터 위에서 이동시키면서 문제를 해결하는 방법. 주로 배열이나 문자열과 같은 선형 데이터 구조에서 사용됩니다.
특징
- 고정 크기의 윈도우를 사용합니다.
- 윈도우를 한 칸씩 이동시키며 데이터를 처리합니다.
- 이전 윈도우의 계산 결과를 활용하여 효율성을 높입니다.
적용 분야
- 연속된 부분 배열의 합 계산
- 문자열 패턴 매칭
- 데이터 스트림에서의 실시간 분석
예시 코드
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
import java.util.Arrays;
public class SlidingWindowExample {
public static int[] findMaxSumSubarray(int[] arr, int k) {
if (arr == null || arr.length == 0 || k <= 0 || k > arr.length) {
return new int[0];
}
int maxSum = 0;
int windowSum = 0;
int startIndex = 0;
// 초기 윈도우의 합 계산
for (int i = 0; i < k; i++) {
windowSum += arr[i];
}
maxSum = windowSum;
// 슬라이딩 윈도우 이동
for (int i = k; i < arr.length; i++) {
windowSum = windowSum - arr[i - k] + arr[i];
if (windowSum > maxSum) {
maxSum = windowSum;
startIndex = i - k + 1;
}
}
// 최대 합을 가진 부분 배열 반환
return Arrays.copyOfRange(arr, startIndex, startIndex + k);
}
public static void main(String[] args) {
int[] arr = {1, 4, 2, 10, 23, 3, 1, 0, 20};
int k = 4;
int[] result = findMaxSumSubarray(arr, k);
System.out.println("최대 합을 가진 부분 배열: " + Arrays.toString(result));
}
}
코드 설명
findMaxSumSubarray메소드는 입력 배열과 윈도우 크기 k를 받습니다.- 먼저 초기 윈도우(처음 k개의 요소)의 합을 계산합니다.
- 그 다음, 윈도우를 한 칸씩 오른쪽으로 이동하면서
- 새로 추가되는 요소를 더하고
- 제거되는 요소를 뺍니다.
- 각 단계에서 현재 윈도우의 합이 지금까지의 최대 합보다 크면 최대 합을 갱신합니다.
- 최종적으로 최대 합을 가진 부분 배열을 반환합니다.
시간 복잡도는 O(n) 여기서 n은 배열의 길이.
このポストは作成者の CC BY 4.0 ライセンスによって保護されます。