[Algorithm] μ¬λΌμ΄λ© μλμ° Sliding Window μκ³ λ¦¬μ¦ νΊμ보기
μ¬λΌμ΄λ© μλμ° μκ³ λ¦¬μ¦ κ°λ
μ¬λΌμ΄λ© μλμ° μκ³ λ¦¬μ¦(Sliding Window Algorithm)μ λ°°μ΄κ³Ό κ°μ μ ν μλ£κ΅¬μ‘°μμ μ°μλ κ΅¬κ° λ΄μ λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ μ²λ¦¬νκΈ° μν΄ μ¬μ©νλ κΈ°λ²μ΄λ€. νΉν λ°°μ΄ λ΄ μ°μλ μμμ ν©, μ΅λκ°, μ΅μκ° λ±μ κ³μ°ν λ μ μ©νλ€.
μ¬λΌμ΄λ© μλμ°λ μ΄λ¦ κ·Έλλ‘ κ³ μ /κ°λ³ ν¬κΈ°μ λ²μ(μλμ°)λ₯Ό μ΄λ(μ¬λΌμ΄λ) μν€λ©΄μ νμν κ³μ°μ λ°λ³΅νλ λ°©μμ΄λ€. μ΄λ μ 체 λ°°μ΄μ ν λ²λ§ μννλ©΄ λκΈ° λλ¬Έμ μ€λ³΅ μ°μ°μ νΌνκ³ μκ° λ³΅μ‘λλ₯Ό κ°μ ν μ μλ€. μΌλ°μ μΌλ‘ μ¬λΌμ΄λ© μλμ° κΈ°λ²μ μ¬μ©νλ©΄ O(n)μ μκ° λ³΅μ‘λλ‘ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
// μ£Όμ΄μ§ λ°°μ΄μμ μ°μλ kκ° μμμ μ΅λ ν©μ μ°Ύλ ν¨μ
function maxSumSubarray(arr, k) {
let maxSum = 0;
let windowSum = 0;
// μ΄κΈ° μλμ°(kκ°μ μμ) ν© κ³μ°
for (let i = 0; i < k; i++) {
windowSum += arr[i];
}
maxSum = windowSum;
// μ¬λΌμ΄λ© μλμ° μ΄λ
for (let end = k; end < arr.length; end++) {
const start = end - k;
// arr[end]κ° μλ‘ μΆκ°λλ μμ μ΄λ―λ‘ arr[end] - arr[start] μμλ‘ κ³μ°
windowSum += arr[end] - arr[start];
maxSum = Math.max(maxSum, windowSum);
}
return maxSum;
}
const result = maxSumSubarray([2, 1, 5, 1, 3, 2], 3);
console.log(result); // 9
μ μμλ μ¬λΌμ΄λ© μλμ° κΈ°λ²μ μ¬μ©νμ¬ λ°°μ΄ λ΄ μ°μλ kκ° μμμ μ΅λ ν©μ μ°Ύλ ν¨μλ€. μλ₯Ό λ€μ΄ μ΄κΈ° λ°°μ΄ [2, 1, 5, 1, 3, 2]
μμ μ²μ 3κ° μμμ ν©μ 2 + 1 + 5 = 8
μ΄λ€. μ΄ν μλμ°λ₯Ό ν μΉΈμ© μ΄λνλ©΄μ kκ°μ μμλ₯Ό λν΄ λκ°λ€.
- (215)132 → 2 + 1 + 5 = 8
- 2(151)32 → 1 + 5 + 1 = 7
- 21(513)2 → 5 + 1 + 3 = 9 (μ΅λκ°)
- 215(132) → 1 + 3 + 2 = 6
ννΈ λ§€λ² μλμ°μ μλ λͺ¨λ k
κ° μμλ₯Ό λ°λ³΅ν΄μ λν νμ μμ΄, μ΄μ μλμ°μμ κ³μ°ν κ°μ, μλ‘ μΆκ°ν μμμ μ κ±°ν μμλ₯Ό λ°μνλ©΄ ν©κ³λ₯Ό λ ν¨μ¨μ μΌλ‘ μ
λ°μ΄νΈν μ μλ€. μ΄μ μλμ° κ³μ°κ° + (μΆκ°νλ μμ - λΉ μ§λ μμ)
μκ°μ μΌλ‘ ννν΄ λ³΄λ©΄ μλμ κ°λ€.
μ¬λΌμ΄λ© μλμ° μκ³ λ¦¬μ¦ νμ©
νλ‘κ·Έλλ¨Έμ€ λ 벨 2 - ν μΈνμ¬ λ¬Έμ (131127)λ μ¬λΌμ΄λ© μλμ° κΈ°λ²μ νμ©ν μ μλ€. μ£Όμ΄μ§ ν μΈ λͺ©λ‘(discount)μμ 10μΌ μ°μ ꡬκ°μ ν¬ν¨λμ΄ μλ μ ν/μλκ³Ό, ꡬ맀νκ³ μΆμ μ ν/μλμ΄ μ νν μΌμΉνλ κ²½μ°μ μ΄κ°μλ₯Ό ꡬνλ λ¬Έμ λ€.
- want: ꡬ맀 μ ν λͺ©λ‘ (λ°°μ΄)
- number: ꡬ맀 μ ν μλ (λ°°μ΄, want λ°°μ΄ μΈλ±μ€μ λ§€ν)
- discount : ν μΈ μ ν λͺ©λ‘ (λ°°μ΄, κ° μΈλ±μ€λ λ μ§λ₯Ό κ°λ¦¬ν΄)
λ¬Έμ λ₯Ό ν΄κ²°νλ €λ©΄ discount λ°°μ΄μ 0λ² μΈλ±μ€λΆν° μννλ©΄μ, ν΄λΉ μμΉμμ μμνλ 10μΌ κ΅¬κ°μ ν μΈ μ ν/μλμ΄, ꡬ맀 μ ν/μλκ³Ό μΌμΉνλμ§ μ¬λΆλ₯Ό νμΈνλ©΄ λλ€.
μ΄λ 10μΌ κ΅¬κ°μ λͺ¨λ μ ν μλμ λ§€λ² κ³μ°ν νμ μμ΄, μ΄μ ꡬκ°μμ κ³μ°ν μλμ° μ 보μ μΆκ°/μ κ±°λλ μ νμ μλλ§ μ‘°μ νλ λ°©μμΌλ‘ λΆνμν μ°μ°μ μ€μΌ μ μλ€.
const WINDOW_SIZE = 10;
function solution(want, number, discount) {
const wantMap = want.reduce((map, item, i) => map.set(item, number[i]), new Map());
const windowMap = new Map();
let count = 0;
// μ΄κΈ° μλμ° μ€μ (첫 10μΌ)
// chicken => 1, apple => 3, banana => 2, rice => 2, pork => 2
for (let i = 0; i < WINDOW_SIZE; i++) {
windowMap.set(discount[i], (windowMap.get(discount[i]) ?? 0) + 1);
}
// νμ¬ μλμ°κ° 쑰건μ λ§μ‘±νλμ§ νμΈ
const checkIfValid = () => {
for (const [item, qty] of wantMap.entries()) {
if ((windowMap.get(item) ?? 0) < qty) return false;
}
return true;
};
// 첫 10μΌ μ²΄ν¬
if (checkIfValid()) count++;
// μ¬λΌμ΄λ© μλμ°λ‘ νμ
for (let i = WINDOW_SIZE; i < discount.length; i++) {
const oldItem = discount[i - WINDOW_SIZE]; // μ΄μ νλͺ© μ κ±°
const newItem = discount[i]; // μλ‘ μΆκ°λ νλͺ© μΆκ°
// μλμ° μ
λ°μ΄νΈ
// i10 = chicken => 1, apple => 3, banana => 2, rice => 2, pork => 2
// i11 = chicken => 0, apple => 3, banana => 2, rice => 2, pork => 2, pot => 1
// i12 = chicken => 0, apple => 2, banana => 3, rice => 2, pork => 2, pot => 1
// ...
windowMap.set(oldItem, windowMap.get(oldItem) - 1);
windowMap.set(newItem, (windowMap.get(newItem) ?? 0) + 1);
// 쑰건 λ§μ‘± μ¬λΆ 체ν¬
if (checkIfValid()) count++;
}
return count;
}
const want = ["banana", "apple", "rice", "pork", "pot"];
const number = [3, 2, 2, 2, 1];
const discount = [
"chicken",
"apple",
"apple",
"banana",
"rice",
"apple",
"pork",
"banana",
"pork",
"rice",
"pot",
"banana",
"apple",
"banana",
];
const result = solution(want, number, discount);
console.log(result); // 3
- ꡬ맀ν΄μΌ νλ μ ν λͺ©λ‘/μλμ λ§€νν Map μμ± (wantMap)
- μ΄κΈ° μλμ° Map μμ± (windowMap)
- μ¬λΌμ΄λ© μλμ°λ‘ discount λ°°μ΄ νμ λ° windowMap μ λ°μ΄νΈ
- μ λ°μ΄νΈν windowMapκ³Ό wantMap λΉκ΅
μ κ³Όμ μ μκ°μ μΌλ‘ ννν΄ λ³΄λ©΄ μλμ κ°λ€.
κΈ μμ μ¬νμ λ Έμ νμ΄μ§μ κ°μ₯ λΉ λ₯΄κ² λ°μλ©λλ€. λ§ν¬λ₯Ό μ°Έκ³ ν΄ μ£ΌμΈμ