ìµëí© ë¶ë¶ ë°°ì´
ì
ë ¥ê°ì arr = [1, -2, 3, 4, -9, 6] ê°ì´ ì«ìë¡ë§ 구ì±ë ë°°ì´ì´ë¼ê³ ê°ì í´ë´
ìë¤.
ì°ë¦¬ê° í´ì¼ í ì¼ì ì¸ì í ììì ì´í©ì´ ìµëì¸ arrì ë¶ë¶ ë°°ì´ì ì°¾ë ê²ì
ëë¤.
ë¶ë¶ ë°°ì´ ììë¤ì í©ì 리í´íë í¨ì getMaxSubSum(arr)를 ìì±í´ ë´
ìë¤.
ìì:
getMaxSubSum([-1, 2, 3, -9]) == 5 (ê°ì¡° íìë ììë¤ì í©)
getMaxSubSum([2, -1, 2, 3, -9]) == 6
getMaxSubSum([-1, 2, 3, -9, 11]) == 11
getMaxSubSum([-2, -1, 1, 2]) == 3
getMaxSubSum([100, -9, 2, -3, 5]) == 100
getMaxSubSum([1, 2, 3]) == 6 (모ë ìì)
ìì ì ì²´ê° ììë¼ë©´ ìë¬´ë° ììë ì ííì§ ììì¼ ìµëê°ì´ ë©ëë¤(ë¶ë¶ ë°°ì´ì ë¹ ë°°ì´). ê·¸ë¦¬ê³ í©ì 0ì´ ë©ëë¤.
getMaxSubSum([-1, -2, -3]) = 0;
ê°ë¥íë¤ë©´ ì±ë¥ì ê³ ë ¤íì¬ ëµìì ìì±í´ ë´ ìë¤. ëµìì O(n2) ëë O(n)ê¹ì§ ê°ë¥í©ëë¤.
í ì¤í¸ ì½ëê° ë´ê¸´ ìëë°ì¤ë¥¼ ì´ì´ ì ëµì ìì±í´ë³´ì¸ì.
ë린 í´ëµ
ë§ë¤ ì ìë 모ë ë¶ë¶ ë°°ì´ì í©ì ê³ì°íë ë°©ë²ì´ ìì ì ììµëë¤.
ì´ë¥¼ 구ííë ê°ì¥ ê°ë¨í ë°©ë²ì ë°°ì´ì ê° ìì를 ììì¼ë¡ íë 모ë ë¶ë¶ ë°°ì´ì í©ì ê³ì°íë ê²ì ëë¤.
ì를 ë¤ì´ ë°°ì´ [-1, 2, 3, -9, 11]ì´ ìë¤ê³ í©ìë¤.
// -1ë¶í° ìì
-1
-1 + 2
-1 + 2 + 3
-1 + 2 + 3 + (-9)
-1 + 2 + 3 + (-9) + 11
// 2ë¶í° ìì
2
2 + 3
2 + 3 + (-9)
2 + 3 + (-9) + 11
// 3ë¶í° ìì
3
3 + (-9)
3 + (-9) + 11
// -9ë¶í° ìì
-9
-9 + 11
// 11ë¶í° ìì
11
ìì ê°ì ìê³ ë¦¬ì¦ì ì¬ì©íë ¤ë©´ ì¤ì²© ë°ë³µë¬¸ì´ íìí©ëë¤. ì¸ë¶ ë°ë³µë¬¸ìì ë°°ì´ì ê° ìì를 ìííê³ , ë´ë¶ ë°ë³µë¬¸ìì ê° ììë¶í° ììíë ë¶ë¶ ë°°ì´ì í©ì ê³ì°íê² ë©ëë¤.
function getMaxSubSum(arr) {
let maxSum = 0; // ì´ë¤ ììë ì ííì§ ìì¼ë©´ 0ì ë°íí©ëë¤.
for (let i = 0; i < arr.length; i++) {
let sumFixedStart = 0;
for (let j = i; j < arr.length; j++) {
sumFixedStart += arr[j];
maxSum = Math.max(maxSum, sumFixedStart);
}
}
return maxSum;
}
alert( getMaxSubSum([-1, 2, 3, -9]) ); // 5
alert( getMaxSubSum([-1, 2, 3, -9, 11]) ); // 11
alert( getMaxSubSum([-2, -1, 1, 2]) ); // 3
alert( getMaxSubSum([1, 2, 3]) ); // 6
alert( getMaxSubSum([100, -9, 2, -3, 5]) ); // 100
ì´ë ê² êµ¬ííë©´ ìê° ë³µì¡ëê° O(n2)ì´ ë©ëë¤. ì´ë ë°°ì´ì í¬ê¸°ë¥¼ 2ë°° ë리면 ìê³ ë¦¬ì¦ì 4ë°°ë ë ì¤ë 걸린ë¤ë ì미ì ëë¤.
í¬ê¸°ê° í° ë°°ì´(1000, 10000 ëë ê·¸ ì´ìì ìì를 ê°ì§ ë°°ì´)ì ìì ê°ì ìê³ ë¦¬ì¦ì ì ì©íë©´ ë§¤ì° ë릴 ì ììµëë¤.
ë¹ ë¥¸ í´ëµ
ë°°ì´ì ìííë©´ì ë³ì sì íì¬ì ë¶ë¶í©ì ì ì¥íë ë°©ë²ë ê°ë¥í©ëë¤. sê° ììê° ë ê²½ì°ë sì 0ì í ë¹íë©´ ë©ëë¤. sì ê° ì¤ ìµëê°ì´ ì ëµì´ ë©ëë¤.
í´ì¤ì´ 모í¸íë¤ê³ ëê»´ì§ë©´ ìë ì½ë를 ì°¸ê³ í´ì£¼ì¸ì.
function getMaxSubSum(arr) {
let maxSum = 0;
let partialSum = 0;
for (let item of arr) { // ë°°ì´ì ê° ìì를
partialSum += item; // partialSumì ëí©ëë¤.
maxSum = Math.max(maxSum, partialSum); // ìµëê°ì 기ìµí´ ëìµëë¤.
if (partialSum < 0) partialSum = 0; // ììê° ëë©´ 0ì ëì
í©ëë¤.
}
return maxSum;
}
alert( getMaxSubSum([-1, 2, 3, -9]) ); // 5
alert( getMaxSubSum([-1, 2, 3, -9, 11]) ); // 11
alert( getMaxSubSum([-2, -1, 1, 2]) ); // 3
alert( getMaxSubSum([100, -9, 2, -3, 5]) ); // 100
alert( getMaxSubSum([1, 2, 3]) ); // 6
alert( getMaxSubSum([-1, -2, -3]) ); // 0
ì´ ìê³ ë¦¬ì¦ì ì íí íë² ë°°ì´ì ìííë¯ë¡ ìê° ë³µì¡ëë O(n)ì ëë¤.
ìê³ ë¦¬ì¦ì ëí ìì¸í ì ë³´ë ìµëí© ë¶ë¶ ë°°ì´ ë¬¸ì ìì ì°¾ì ì ììµëë¤. ëìì리ì ëí´ íì¤í ì´í´ê° ëì§ ììë¤ë©´ ì ìì ì ìê³ ë¦¬ì¦ì´ ì´ë»ê² ëìíëì§ ì°¬ì°¬í ì´í´ë³´ì¸ì. ê¸ì ì½ë ê²ë³´ë¤ ì½ë를 ì´í´ë³´ëê² í¨ì¬ ëìì´ ë ê²ëë¤.
í ì¤í¸ ì½ëê° ë´ê¸´ ìëë°ì¤ë¥¼ ì´ì´ ì ëµì íì¸í´ë³´ì¸ì.