5. λμ ν© (Prefix Sums) Codility Lesson νκ΅μ΄ μ 리본 (JavaScript ver.)
λμ ν©(Prefix Sums)μ΄λ?
λ°°μ΄μ νΉμ ꡬκ°(μ¬λΌμ΄μ€)μ ν©μ λΉ λ₯΄κ² κ³μ°νλ κ°λ ₯ν κΈ°λ²μ΄ λμ ν©(Prefix Sums) μ΄λ€. μ΄λ λ°°μ΄μ μ²μλΆν° νΉμ μμΉκΉμ§μ ν©μ 미리 κ³μ°ν΄ μ μ₯νλ λ°©λ²μ΄λ€.
μλ₯Ό λ€μ΄, λ°°μ΄ Aκ° λ€μκ³Ό κ°λ€κ³ νμ.
A = [aβ, aβ, aβ, ..., aβββ]
κ·Έλ¬λ©΄ λμ ν© λ°°μ΄ Pλ λ€μκ³Ό κ°μ΄ μ μλλ€.
P[0] = 0
P[1] = aβ
P[2] = aβ + aβ
P[3] = aβ + aβ + aβ
...
P[n] = aβ + aβ + ... + aβββ
μ΄μ κ° P[k-1]μ νμ¬ κ° A[k-1]μ λνλ λ°©μμΌλ‘ λμ ν©μ κ³μ°ν μ μμΌλ©°, μ 체 μ°μ°μ O(n) μ μκ° λ³΅μ‘λλ₯Ό κ°μ§λ€.
1. O(n) μκ° λ³΅μ‘λμ λμ ν© κ³μ°
JavaScript μ½λ:
function prefixSums(A) {
let n = A.length;
let P = new Array(n + 1).fill(0);
for (let k = 1; k <= n; k++) {
P[k] = P[k - 1] + A[k - 1];
}
return P;
}
μ΄ ν¨μλ μ λ ₯ λ°°μ΄ Aμ λμ ν©μ κ³μ°νμ¬ λ°ννλ€.
2. O(1) μκ° λ³΅μ‘λμ κ΅¬κ° ν© κ³μ°
λμ ν©μ νμ©νλ©΄ νΉμ κ΅¬κ° [x..y]μ ν©μ O(1) λ§μ ꡬν μ μλ€.
κ΅¬κ° ν©: P[y + 1] - P[x]
JavaScript μ½λ:
function countTotal(P, x, y) {
return P[y + 1] - P[x];
}
μ΄ λ°©λ²μ μ¬μ©νλ©΄ O(n + m) μκ° λ³΅μ‘λλ‘ μ¬λ¬ κ°μ κ΅¬κ° ν©μ λΉ λ₯΄κ² κ³μ°ν μ μλ€.
3. λ²μ― μ€κΈ° λ¬Έμ
λλ‘ μ νΉμ μμΉ kμμ μμνμ¬ μ΅λ mλ² μ΄λνλ©΄μ λ²μ―μ μ΅λν λ§μ΄ μμ§νλ λ¬Έμ μ΄λ€. μ΄λμ μΈμ ν μμΉλ‘λ§ κ°λ₯νλ€.
O(n²) (λΉν¨μ¨μ μΈ λ°©λ²)
function slowMushrooms(A, k, m) {
let n = A.length;
let result = 0;
for (let p = 0; p <= m; p++) {
let left = k - p;
let right = Math.min(n - 1, k + (m - 2 * p));
let sum = 0;
for (let i = left; i <= right; i++) {
sum += A[i];
}
result = Math.max(result, sum);
}
return result;
}
μ΄ λ°©λ²μ O(m²) μκ°μ΄ μμλλ€.
O(n + m) (ν¨μ¨μ μΈ λ°©λ²)
λμ ν©μ μ΄μ©νμ¬ O(n + m) μκ° λ³΅μ‘λλ‘ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
function mushrooms(A, k, m) {
let n = A.length;
let result = 0;
let P = prefixSums(A);
for (let p = 0; p <= Math.min(m, k); p++) {
let left = k - p;
let right = Math.min(n - 1, Math.max(k, k + m - 2 * p));
result = Math.max(result, countTotal(P, left, right));
}
for (let p = 0; p <= Math.min(m, n - k - 1); p++) {
let right = k + p;
let left = Math.max(0, Math.min(k, k - (m - 2 * p)));
result = Math.max(result, countTotal(P, left, right));
}
return result;
}
μ΄ λ°©λ²μ λμ ν©μ νμ©νμ¬ μ¬λΌμ΄μ€ ν©μ O(1)μ κ³μ°νλ―λ‘ μ 체 μ°μ°μ O(n + m) μκ° λ³΅μ‘λλ‘ μνν μ μλ€.