์ต๋ ์ฌ๋ผ์ด์ค ๋ฌธ์ ๋?
์ฃผ์ด์ง ์ ์ ๋ฐฐ์ด A = [aโ, aโ, ..., aโโโ] ์์ ์ฐ์๋ ๋ถ๋ถ ๋ฐฐ์ด(์ฌ๋ผ์ด์ค, Slice) ์ค ํฉ์ด ์ต๋๊ฐ ๋๋ ๊ตฌ๊ฐ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค. ์ฆ, ๋ ์ธ๋ฑ์ค p, q (p ≤ q)๋ฅผ ์ ํํ์ฌ A[p] + A[p+1] + ... + A[q] ๊ฐ์ด ์ต๋๊ฐ ๋๋ ๊ฒฝ์ฐ ๋ฅผ ์ฐพ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๋ฐฐ์ด์ด ์์ ๋:
A = [5, -7, 3, 5, -2, 4, -1];
์ ๋ฐฐ์ด์์ ์ต๋ ํฉ์ ๊ฐ๋ ๋ถ๋ถ ๋ฐฐ์ด์ [3, 5, -2, 4]์ด๋ฉฐ, ํฉ์ 10์ด๋ค.
1. O(n³) ์๊ฐ ๋ณต์ก๋์ ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ
๋ชจ๋ ๊ฐ๋ฅํ ์ฌ๋ผ์ด์ค๋ฅผ ํ์ํ์ฌ ์ต๋๊ฐ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๋ค.
JavaScript ์ฝ๋:
function slowMaxSlice(A) {
let n = A.length;
let result = 0;
for (let p = 0; p < n; p++) {
for (let q = p; q < n; q++) {
let sum = 0;
for (let i = p; i <= q; i++) {
sum += A[i];
}
result = Math.max(result, sum);
}
}
return result;
}
์๊ฐ ๋ณต์ก๋: O(n³) (๋ชจ๋ ๊ฐ๋ฅํ ์ฌ๋ผ์ด์ค๋ฅผ ๋ฐ๋ณต ํ์)
2. O(n²) ์๊ฐ ๋ณต์ก๋์ ๊ฐ์ ๋ ๋ฐฉ๋ฒ
๋์ ํฉ(Prefix Sums)์ ์ด์ฉํ๋ฉด O(n²) ๋ก ๊ฐ์ ํ ์ ์๋ค.
JavaScript ์ฝ๋:
function quadraticMaxSlice(A) {
let n = A.length;
let result = 0;
for (let p = 0; p < n; p++) {
let sum = 0;
for (let q = p; q < n; q++) {
sum += A[q];
result = Math.max(result, sum);
}
}
return result;
}
์๊ฐ ๋ณต์ก๋: O(n²) (๋ถ๋ถํฉ์ ์ ์ฅํ์ฌ ์ค๋ณต ๊ณ์ฐ ์ ๊ฑฐ)
3. O(n) ์๊ฐ ๋ณต์ก๋์ ์ต์ ํ๋ ๋ฐฉ๋ฒ (์นด๋ฐ์ธ ์๊ณ ๋ฆฌ์ฆ)
์์ด๋์ด:
- maxEnding ๋ณ์์ ํ์ฌ๊น์ง์ ์ต๋ ์ข ๋ฃ ๋ถ๋ถํฉ ์ ์ ์ฅ.
- ๋ค์ ์์๋ฅผ ์ถ๊ฐํ์ ๋, maxEnding ์ด ์์์ด๋ฉด ๊ทธ๋๋ก ๋ํ๊ณ , ์์์ด๋ฉด 0์ผ๋ก ์ด๊ธฐํ.
- ์ ์ฒด ๋ฐฐ์ด์์ ๊ฐ์ฅ ํฐ maxEnding ๊ฐ์ ๋ฐํ.
JavaScript ์ฝ๋:
function goldenMaxSlice(A) {
let maxEnding = 0;
let maxSlice = 0;
for (let a of A) {
maxEnding = Math.max(0, maxEnding + a);
maxSlice = Math.max(maxSlice, maxEnding);
}
return maxSlice;
}
์๊ฐ ๋ณต์ก๋: O(n) (ํ ๋ฒ์ ๋ฃจํ๋ง ์ํ)
ํ์ง๋ง ์์ ์ฝ๋๋ ๋ชจ๋ ๋ฐฐ์ด์ ๊ฐ์ด ์์์ผ ๊ฒฝ์ฐ, ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์์ผ๋ฏ๋ก, ์ฌ๋ฐ๋ฅธ ์ฝ๋๋
function goldenMaxSlice(A) {
let maxEnding = A[0];
let maxSlice = A[0];
for (let i = 1; i < A.length; i++) {
// Either start a new slice at A[i] or continue the previous one
maxEnding = Math.max(A[i], maxEnding + A[i]);
maxSlice = Math.max(maxSlice, maxEnding);
}
return maxSlice;
}
๋๊ธ