๋์ ํฉ(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) ์๊ฐ ๋ณต์ก๋๋ก ์ํํ ์ ์๋ค.
๋๊ธ