์๋ ๋งํฌ๋ฅผ ํด๋ฆญํด ์๋ก์ด ๋ธ๋ก๊ทธ์์ ๋ ๋ง์ ๊ธ์ ๋ง๋๋ณด์ธ์.
๐
์ด์ ๋ธ๋ก๊ทธ ๋ฐ๋ก ๊ฐ๊ธฐ
[Programmers] 42897/๋๋์ง/javascript

๐ก ๋ฌธ์ ์ค๋ช
ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ์ค๋ช ์ ๋งํฌ๋ก ๋์ฒดํฉ๋๋ค.
๐ฅ ์ ๋ ฅ
| 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

ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๋๊ธ๋จ๊ธฐ๊ธฐ