2. Slide Window
- 연속된 데이터(주로 배열이나 리스트)에서 일정한 크기의 구간(윈도우)을 움직이며 문제를 해결하는 패턴입니다. 윈도우의 크기가 고정된 경우와 가변적인 경우가 있습니다.
- 배열이나 문자열 같은 일련의 데이터를 입력하거나 특정 방식으로 연속적인 해당 데이터의 하위 집합을 찾는 경우에 유용한 패턴입니다.
대표적인 문제 예시
: LeetCode - Minimum Size Subarray Sum
주어진 양수로 이루어진 배열에서 연속된 부분 수열 중 원하는 합 이상을 만족하는 최소 길이의 부분 수열을 찾는 문제입니다.
data example 1
Input: target = 7, nums = [2,3,1,2,4,3]
Output: 2
data example 2
Input: target = 11, nums = [1,1,1,1,1,1,1,1]
Output: 0
data example 3
Input: target = 15, nums = [1,2,3,4,5]
Output: 5
Bad Solution : O(n^3)
function minSubarrayLenBad(target, nums) {
let minLength = Infinity;
for (let start = 0; start < nums.length; start++) {
for (let end = start; end < nums.length; end++) {
let sum = 0;
for (let i = start; i <= end; i++) {
sum += nums[i];
}
if (sum >= target) {
minLength = Math.min(minLength, end - start + 1);
break; // 현재 start에 대한 최소 길이 찾음
}
}
}
return minLength === Infinity ? 0 : minLength;
}
알고리즘 적용 : O(n)
function minSubarrayLen(target, nums) {
let minLength = Infinity;
let start = 0;
let sum = 0;
for (let end = 0; end < nums.length; end++) {
sum += nums[end];
while (sum >= target) {
minLength = Math.min(minLength, end - start + 1);
sum -= nums[start];
start++;
}
}
return minLength === Infinity ? 0 : minLength;
}
- minLength 변수는 현재까지 찾은 최소 길이를 저장하는 변수로 초기에는 Infinity로 설정하여 아직 최소 길이를 찾지 못한 상태를 나타냅니다.
- start 변수는 현재 윈도우의 시작 인덱스를 나타내며, 초기에는 0으로 설정됩니다.
- sum 변수는 윈도우 내의 요소들의 합을 나타내는 변수입니다. 윈도우 내의 요소를 하나씩 더하면서 합을 갱신합니다.
- 반복문에서 end 변수는 윈도우의 끝 인덱스를 나타냅니다. end가 배열의 길이보다 작은 동안 반복합니다.
- sum에 현재 end 인덱스의 요소를 더하고 윈도우의 합을 갱신합니다.
- 내부 while 루프는 윈도우 내의 합이 target 이상이 될 때까지 반복합니다. 이렇게 하면 최소 길이를 구할 수 있습니다.
- minLength은 현재까지 찾은 최소 길이와 현재 윈도우의 길이 중 작은 값을 선택하여 갱신합니다.
- sum에서 윈도우의 시작 요소를 빼고 합을 갱신합니다. 이렇게 하면 윈도우 내의 요소 합을 관리합니다.
- 윈도우의 시작 인덱스를 오른쪽으로 이동합니다.
- 마지막으로 최종적으로 계산된 최소 길이를 반환합니다. 만약 최소 길이가 갱신되지 않았다면 (Infinity 상태라면) 0을 반환합니다.
'CS' 카테고리의 다른 글
[자료구조]Linked list - 몇가지 구현 JS (0) | 2023.08.30 |
---|---|
[알고리즘] 문제 해결 패턴 - 기본: Divied and Conquer (0) | 2023.08.28 |
[자료구조] Linked list - 1 (0) | 2023.08.26 |
[알고리즘] 문제 해결 패턴 - 기본: Two Pointers (0) | 2023.08.25 |
[알고리즘] Big 0 표기법 (0) | 2023.08.25 |