Skip to content

Commit 032fb8c

Browse files
committed
feat : 250912-sliding-window
1 parent 7b29dad commit 032fb8c

File tree

1 file changed

+135
-0
lines changed
  • content/blog/250912-sliding-window

1 file changed

+135
-0
lines changed
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
---
2+
title: "슬라이딩 윈도우(Sliding Window) 알고리즘"
3+
description: "sliding window 알고리즘 기록용"
4+
date: "2025-09-12T20:15:22"
5+
thumbnail: "./thumbnail.png"
6+
category: "Algorithm"
7+
tags: ["Algorithm"]
8+
---
9+
10+
# 슬라이딩 윈도우 (Sliding Window) 알고리즘
11+
12+
슬라이딩 윈도우 알고리즘은 배열이나 문자열에서 특정 크기의 윈도우를 이동하며 특정 조건을 만족하는 부분을 찾는 알고리즘이에요.
13+
14+
```ts
15+
function maxSubarraySum(arr, num) {
16+
let maxSum = 0
17+
let tempSum = 0
18+
if (arr.length < num) return null
19+
for (let i = 0; i < num; i++) {
20+
maxSum += arr[i]
21+
}
22+
tempSum = maxSum
23+
for (let i = num; i < arr.length; i++) {
24+
tempSum = tempSum - arr[i - num] + arr[i]
25+
maxSum = Math.max(maxSum, tempSum)
26+
}
27+
return maxSum
28+
}
29+
```
30+
31+
위 코드는 슬라이딩 윈도우 알고리즘을 이용한 코드인데요.
32+
33+
배열을 이동하면서, num의 수 만큼 배열의 요소를 더하고, 그 중 가장 큰 값을 반환하는 코드에요.
34+
35+
에를들어서
36+
37+
```ts
38+
maxSubarraySum([2, 6, 9, 2, 1, 8, 5, 6, 3], 3)
39+
```
40+
41+
우선 위 함수의 결과로는 19가 나옵니다.
42+
43+
함수를 이렇게 호출한다고 해볼께요.
44+
45+
그러면 2, 6, 9 를 일단 더하고 그 다음 6, 9, 2 를 더하고 서로 비교해요. 대충 이런식으로 배열을 순회하면서
46+
47+
가장 큰 값을 반환하는 솔루션이에요.
48+
49+
마치 창문이 슬라이딩 하는것 같죠?
50+
51+
```
52+
[2, 6, 9] 2, 1, 8, 5, 6, 3 -> 합 17
53+
2, [6, 9, 2] 1, 8, 5, 6, 3 -> 합 17
54+
2, 6, [9, 2, 1] 8, 5, 6, 3 -> 합 12
55+
2, 6, 9, [2, 1, 8] 5, 6, 3 -> 합 11
56+
2, 6, 9, 2, [1, 8, 5] 6, 3 -> 합 14
57+
2, 6, 9, 2, 1, [8, 5, 6] 3 -> 합 19
58+
2, 6, 9, 2, 1, 8, [5, 6, 3] -> 합 14
59+
```
60+
61+
(대충 창문이 슬라이딩 같다는 걸 이해시키려고 작성함)
62+
63+
그래서 슬라이딩 윈도우다 이말입니다~ 엣헴.
64+
65+
이 알고리즘의 핵심 로직은 아무래도
66+
67+
```ts
68+
for (let i = num; i < arr.length; i++) {
69+
tempSum = tempSum - arr[i - num] + arr[i]
70+
maxSum = Math.max(maxSum, tempSum)
71+
}
72+
```
73+
74+
이 부분일텐데요.
75+
76+
특히 이 부분에서도
77+
78+
```ts
79+
tempSum = tempSum - arr[i - num] + arr[i]
80+
```
81+
82+
이부분이죠.
83+
84+
이 부분이 슬라이딩 윈도우를 해주고있습니다요.
85+
86+
보시면 이전 합계(tempSum)에서 첫번째 요소를 빼고 새로운 요소를 더해주고 있어요.
87+
88+
```ts
89+
// num = 3 (창문크기)
90+
91+
// for 문 진입시 i = 3 (num 값)
92+
// 여기서 왜 i에 num 값을 넣냐면
93+
94+
[2, 6, 9] 2, 1, 8, 5, 6, 3
95+
96+
// 위의 합계는 이미
97+
98+
for (let i = 0; i < num; i++) {
99+
maxSum += arr[i]
100+
}
101+
102+
// 함수 처음에 이렇게 합게를 구해놓고 시작하기 때문에
103+
// i = 3 으로 해줘야 배열이 이동하는 형상을 보이겠져?
104+
// i는 인덱스로 쓰이니깐여.
105+
106+
// 아무튼 핵심 로직을 한번 타면 아래와 같은 그림이됩니다.
107+
108+
// tempSum = tempSum - arr[i - num] + arr[i]
109+
// 여기서 arr[i - num] 이 arr[3 - 3] 이니까 배열의 첫번째 인덱스잖아요?
110+
// 그 값을 빼주는거에요.
111+
112+
// tempSum = tempSum - arr[i - num] + arr[i] 이 식을
113+
// tempSum = tempSum , - arr[i - num] , + arr[i] 이렇게 나눠서 생각해보면 이해가 쉬워요.
114+
115+
116+
[2, 6, 9], 2, 1, 8, 5, 6, 3
117+
118+
// 여기서 arr[0] 을 빼면
119+
120+
2, [6, 9], 2, 1, 8, 5, 6, 3
121+
122+
// 이런 형상이되겟져?
123+
124+
// 그 다음 + arr[i] 를 해주니깐
125+
126+
2, [6, 9, 2], 1, 8, 5, 6, 3
127+
128+
// 이렇게 되는거에요
129+
```
130+
131+
이해가 잘 됐으면 좋겠네요.
132+
133+
제가 알고리즘 실력도 처참하고 설명을 막 잘하는편이아니라 설명이 길어서 더 어려울 수 있겠지만..
134+
135+
봐주셔서 감사함다.

0 commit comments

Comments
 (0)