|
| 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