포스트

JS 슬라이딩 윈도우 패턴

jslogo

슬라이딩 윈도우 패턴

배열이나 문자열과 같은 일련의 데이터를 입력하거나 특정 방식으로 연속적인 해당 데이터의 하위 집합을 사용하여 일련의 조건을 검사하고, 그에 따른 Process를 진행하는 패턴

예시 문제

  • maxSubArraysum 함수를 작성하라
  • 인수로 array (int) 와 n (int) 를 받는다.
  • array 안애서 연속된 n 개의 수의 합이 제일 큰 값을 반환하라.

테스트 케이스

1
2
3
4
5
maxSubArraysum([1,2,5,2,8,1,5], 2) // 10 : 인접한 2+8이 제일 크다
maxSubArraysum([1,2,5,2,8,1,5], 4) // 17 : 2+5+2+8 이 제일 크다.
maxSubArraysum([1,2,4,1,6], 1) // 6 : 6이 제일 크다.
maxSubArraysum([4,2,1,6,2], 4) // 13 : 4 + 2+ 1 + 6 이 제일크다.
maxSubArraysum([], 4) // null

기본 해결 방법 - O(N^2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function maxSubArraySum(arr,num) {
	if(arr.length < num) {
	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 ++ ) {
			temp += arr[i + j];
		}
		if (max < temp) {
			max = temp
		}
	}
}

슬라이딩 윈도우 패턴 해결법 - O(N)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function maxSubArraySum_solution(arr, num) {
	let maxSum = 0;
	let tempSum = 0;
	if (arr.length < num) return null;
	// 최초 Max 생성
	for (let i = 0; i < num; i++) {
		maxSum += arr[i[;
	}
	
	tempSum = maxSum;
	
	for(let i = num; i<arr.length; i++) {
		tempSum = tempSum - arr[i - num] + arr[i]
		maxSum = Math.max(maxSum, tempMax);
	}
  return maxSum;
}

이해를 하기위한 필기…

슬라이딩윈도우-필기

배운점

  • 슬라이딩 윈도우 패턴 이해하는데 40분 넘게 걸렸다.
  • 근데 진짜 이름 그대로 여닫이 창문으로 이해해버렸다.
  • 이걸 내가 제로에서 구현할수 있을까?

강의

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.