[알고리즘] 기준점 간 이동 배열 패턴 (Sliding Window)

728x90
반응형

[알고리즘] 기준점 간 이동 배열 패턴 (Sliding Window)

슬라이딩 윈도우(Sliding Window) 알고리즘은 배열이나 리스트와 같은 데이터 구조에서 연속적인 서브 배열(subarray) 또는 서브 리스트(sublist) 문제를 해결하는 데 사용되는 최적화 기법입니다.

이 알고리즘을 사용하면 불필요한 계산을 줄이고 효율적으로 문제를 해결할 수 있습니다.

 

슬라이딩 윈도우 알고리즘은 고정된 크기의 "윈도우"(부분 배열)를 사용하여 배열을 반복적으로 순회하면서 윈도우의 시작점과 끝점을 이동시키는 방식입니다.

윈도우를 오른쪽으로 한 칸씩 슬라이드하면서, 새로운 요소를 추가하고 이전 요소를 제거하는 방식으로 문제를 해결합니다.

 

 

문제 [ 고정 크기 윈도우 ]

임의의 숫자 배열와 숫자 k가 주어졌을 때, 연속된 k개의 요소의 최대 합을 구하시오.


  
maxSubarraySum([1, 2, 5, 2, 8, 1, 5], 2) // 10
maxSubarraySum([1, 2, 5, 2, 8, 1, 4], 4) // 17
maxSubarraySum([], 2) // null

 

 

O(n^2)의 시간 복잡도 해결책

시간 복잡도 = O( n^2 )


  
function maxSubarraySum(arr, num) {
if (num > arr.length) {
return null
}
let max = -Infinity;
for (let i = 0; i < arr.length - num + 1; i++) {
let temp = 0;
for (let j = 0; j < num; j++) {
tem += arr[i + j];
}
if (tem > max) {
max = tem;
}
}
return max;
}

 

 

 

O(n)의 시간 복잡도 해결책

시간 복잡도 = O( n )


  
function maxSubarraySum(arr, num) {
let maxSum = 0;
let temSum = 0;
if (num > arr.length) {
return null;
}
for (let i = 0; i < num; i++) {
maxSum += arr[i];
}
for (let i = num; i < arr.length; i++) {
temSum = maxSum - arr[i - num] + arr[i];
maxSum = Math.max(temSum, maxSum);
}
return maxSum;
}

 

접근 방식

  1. 먼저, 배열의 처음 k개의 요소의 합을 계산하여 초기 윈도우의 합을 구합니다.
  2. 그런 다음, 윈도우를 오른쪽으로 한 칸씩 슬라이드하면서 새로운 요소를 추가하고, 이전 요소를 제거하여 현재 윈도우의 합을 업데이트합니다.
  3. 각 단계에서 최대 합을 갱신합니다.
728x90
반응형

댓글