๐Ÿ“ข ๋ธ”๋กœ๊ทธ ์ด์‚ฌ ์ค‘์ž…๋‹ˆ๋‹ค!

์•„๋ž˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•ด ์ƒˆ๋กœ์šด ๋ธ”๋กœ๊ทธ์—์„œ ๋” ๋งŽ์€ ๊ธ€์„ ๋งŒ๋‚˜๋ณด์„ธ์š”.
๐Ÿ‘‰ ์ด์ „ ๋ธ”๋กœ๊ทธ ๋ฐ”๋กœ ๊ฐ€๊ธฐ

2 ๋ถ„ ์†Œ์š”

PROGRAMMERS

๐Ÿ’ก ๋ฌธ์ œ ์„ค๋ช…

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ์„ค๋ช…์€ ๋งํฌ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ์„ค๋ช…

๐Ÿ“ฅ ์ž…๋ ฅ

money
[1,2,3,1]

๐Ÿ“ค ์ถœ๋ ฅ

result
4

๐Ÿ“ ์ œํ•œ ์‚ฌํ•ญ

  • ์ด ๋งˆ์„์— ์žˆ๋Š” ์ง‘์€ 3๊ฐœ ์ด์ƒ 1,000,000๊ฐœ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • money ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ๋Š” 0 ์ด์ƒ 1,000 ์ดํ•˜์ธ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค.

๐Ÿ“ฅ ์˜ˆ์ œ ์ž…๋ ฅ

money: [1, 2, 3, 1];

๐Ÿ“ค ์˜ˆ์ œ ์ถœ๋ ฅ

4;

๐Ÿ’ก ํ’€์ด

โœ๏ธ ํ’€์ด๊ณผ์ •

๊ทธ๋ƒฅ dp์ธ๋ฐ ์ฒ˜์Œ ์ง‘ ํ„ธ๊นŒ ์•ˆํ„ธ๊นŒ๊ฐ€ ๋์ธ ๋ฌธ์ œ. ๋™๊ทธ๋ž€ ๋ฐฐ์น˜๋ณด๋ฉด ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์Œ.

๐Ÿ“–๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ JS Code

function solution(money) {
  const len = money.length;
  const dp1 = Array(len).fill(0);
  const dp2 = Array(len).fill(0);
  dp1[0] = dp1[1] = money[0];
  dp2[1] = money[1];
  for (let i = 2; i < len; i++)
    dp1[i] = Math.max(dp1[i - 2] + money[i], dp1[i - 1]);
  for (let i = 2; i < len; i++)
    dp2[i] = Math.max(dp2[i - 2] + money[i], dp2[i - 1]);
  return Math.max(dp1[len - 2], dp2[len - 1]);
}

๐Ÿง  ์ฝ”๋“œ ๋ฆฌ๋ทฐ

  • ์žฅ์ 
    • ์›ํ˜• ๋„๋‘‘์งˆ ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์„ ์ •ํ™•ํžˆ ์งš์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ์ง‘์„ ํ„ธ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ ๊ฒฝ์šฐ(dp1)์™€ ํ„ธ์ง€ ์•Š์€ ๊ฒฝ์šฐ(dp2)๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์„ ํ˜• ํ•˜์šฐ์Šค ๋กœ๋ฒ„(House Robber)๋กœ ํ™˜์›ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •์ด ํƒ€๋‹นํ•ฉ๋‹ˆ๋‹ค. dp1[1] = money[0]๋กœ ๋‘์–ด ์ฒซ ์ง‘์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ 2๋ฒˆ์งธ ์ง‘์€ ์„ ํƒ ๋ถˆ๊ฐ€๋ฅผ ๋ช…ํ™•ํžˆ ๋ฐ˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ๋‘ ๋ฒˆ์˜ ๋™์ผ ํŒจํ„ด ๋ฃจํ”„(2..len-1)๋กœ ์ง๊ด€์ ์ธ ์ ํ™”์‹ dp[i] = max(dp[i-1], dp[i-2] + money[i])์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„/๊ถŒ์žฅ ๋ฆฌํŒฉํ„ฐ๋ง 1) ๊ณต๊ฐ„ ๋ณต์žก๋„: ํ˜„์žฌ O(n) ๋ฐฐ์—ด 2๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋กค๋ง ๋ณ€์ˆ˜(2์นธ ๋ฉ”๋ชจ๋ฆฌ)๋กœ O(1)๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2) ๋ณ€์ˆ˜/๋„ค์ด๋ฐ ๊ฐ€๋…์„ฑ: dp1, dp2 ๋Œ€์‹  includeFirst, excludeFirst ๋“ฑ ์˜๋ฏธ๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ด๋ฆ„์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. 3) ๊ฒฝ๊ณ„ ์ฒ˜๋ฆฌ ์ฃผ์„: ๋ฌธ์ œ ์ œ์•ฝ์ƒ ์ง‘์˜ ๊ฐœ์ˆ˜๋Š” 3 ์ด์ƒ์ด์ง€๋งŒ, ์ผ๋ฐ˜์„ฑ์„ ๋†’์ด๋ ค๋ฉด len <= 2์— ๋Œ€ํ•œ ์„ค๋ช…/๊ฐ€๋“œ ์ฃผ์„์„ ๋”ํ•˜๋ฉด ๋…์ž ์นœํ™”์ ์ž…๋‹ˆ๋‹ค.

  • ์ •ํ™•์„ฑ
    • ์›ํ˜• ์ œ์•ฝ(์ฒซ ์ง‘๊ณผ ๋งˆ์ง€๋ง‰ ์ง‘ ๋™์‹œ ์„ ํƒ ๋ถˆ๊ฐ€)์„ ๋‘ ์ผ€์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๋Š” ์ ‘๊ทผ์€ ์ •๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ์‹œ max(dp1[len-2], dp2[len-1])๋กœ ๋งˆ์ง€๋ง‰ ์ง‘ ํฌํ•จ/๋ฐฐ์ œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณต์žก๋„
    • ์‹œ๊ฐ„: O(n)
    • ๊ณต๊ฐ„: O(n) (๋ฐฐ์—ด 2๊ฐœ). ๋กค๋ง ๋ณ€์ˆ˜๋กœ O(1) ๊ฐ€๋Šฅ
  • ์—ฃ์ง€ ์ผ€์ด์Šค ์ฒดํฌ๋ฆฌ์ŠคํŠธ
    • ์ „๋ถ€ 0์ธ ์ž…๋ ฅ: ๊ฒฐ๊ณผ๋Š” 0์ด์–ด์•ผ ํ•จ
    • ๋งค์šฐ ํฐ n(์ตœ๋Œ€ 1,000,000): ๋ฐฐ์—ด 2๊ฐœ ์ƒ์„ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ณ ๋ ค ํ•„์š” โ†’ O(1) ๊ณต๊ฐ„ ๋Œ€์•ˆ ๊ถŒ์žฅ
    • ํฐ ํ•ฉ๊ณ„(์ตœ๋Œ€ ์•ฝ 1e9): JS Number(53-bit ์ •๋ฐ€) ๋ฒ”์œ„ ๋‚ด์—์„œ ์•ˆ์ „
  • ๋ฆฌํŒฉํ„ฐ๋ง ์˜ˆ์‹œ(O(1) ๊ณต๊ฐ„, ๋™์ผ ์ •๋‹ต)
function solution(money) {
  const n = money.length;
  if (n === 1) return money[0];
  if (n === 2) return Math.max(money[0], money[1]);

  // ์ผ€์ด์Šค 1: ์ฒซ ์ง‘ ํฌํ•จ(๋งˆ์ง€๋ง‰ ์ง‘ ์ œ์™ธ, ์ธ๋ฑ์Šค 0..n-2)
  let prev2 = money[0];           // dp[i-2]
  let prev1 = money[0];           // dp[i-1] (i=1์ผ ๋•Œ money[0])
  for (let i = 2; i < n - 1; i++) {
    const cur = Math.max(prev1, prev2 + money[i]);
    prev2 = prev1;
    prev1 = cur;
  }
  const includeFirst = prev1;

  // ์ผ€์ด์Šค 2: ์ฒซ ์ง‘ ์ œ์™ธ(๋งˆ์ง€๋ง‰ ์ง‘ ํฌํ•จ ๊ฐ€๋Šฅ, ์ธ๋ฑ์Šค 1..n-1)
  prev2 = 0;                      // dp[0] = 0 (๊ฐ€์ƒ์˜ ์‹œ์ž‘)
  prev1 = money[1];               // dp[1]
  for (let i = 2; i < n; i++) {
    const cur = Math.max(prev1, prev2 + money[i]);
    prev2 = prev1;
    prev1 = cur;
  }
  const excludeFirst = prev1;

  return Math.max(includeFirst, excludeFirst);
}

๐Ÿ’ป๊ฒฐ๊ณผ

โšก Javascript

js_result

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

๐Ÿ–ฑ๏ธ์ฐธ๊ณ  ๋งํฌ

MDN- Math.max

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ