[Algorithm] μ€ν°μ»€ λͺ¨μΌκΈ°2
π λ¬Έμ
Nκ°μ μ€ν°μ»€κ° μνμΌλ‘ μ°κ²°λμ΄ μμ΅λλ€. λ€μ κ·Έλ¦Όμ N = 8μΈ κ²½μ°μ μμμ λλ€.

μνμΌλ‘ μ°κ²°λ μ€ν°μ»€μμ λͺ μ₯μ μ€ν°μ»€λ₯Ό λ―μ΄λ΄μ΄ λ―μ΄λΈ μ€ν°μ»€μ μ ν μ«μμ ν©μ΄ μ΅λκ° λλλ‘ νκ³ μΆμ΅λλ€. λ¨ μ€ν°μ»€ ν μ₯μ λ―μ΄λ΄λ©΄ μμͺ½μΌλ‘ μΈμ ν΄μλ μ€ν°μ»€λ μ°’μ΄μ Έμ μ¬μ©ν μ μκ² λ©λλ€.
μλ₯Ό λ€μ΄ μ κ·Έλ¦Όμμ 14κ° μ ν μ€ν°μ»€λ₯Ό λ―μΌλ©΄ μΈμ ν΄μλ 10, 6μ΄ μ ν μ€ν°μ»€λ μ¬μ©ν μ μμ΅λλ€. μ€ν°μ»€μ μ ν μ«μκ° λ°°μ΄ ννλ‘ μ£Όμ΄μ§ λ, μ€ν°μ»€λ₯Ό λ―μ΄λ΄μ΄ μ»μ μ μλ μ«μμ ν©μ μ΅λκ°μ return νλ solution ν¨μλ₯Ό μμ±ν΄ μ£ΌμΈμ. μνμ μ€ν°μ»€ λͺ¨μμ μν΄ λ°°μ΄μ 첫 λ²μ§Έ μμμ λ§μ§λ§ μμκ° μλ‘ μ°κ²°λμ΄ μλ€κ³ κ°μ£Όν©λλ€.
μ ν μ¬ν
- stickerλ μνμΌλ‘ μ°κ²°λ μ€ν°μ»€μ κ° μΉΈμ μ ν μ«μκ° μμλλ‘ λ€μ΄μλ λ°°μ΄λ‘, κΈΈμ΄(N)λ 1 μ΄μ 100,000 μ΄νμ λλ€.
- stickerμ κ° μμλ μ€ν°μ»€μ κ° μΉΈμ μ ν μ«μμ΄λ©°, κ° μΉΈμ μ ν μ«μλ 1 μ΄μ 100 μ΄νμ μμ°μμ λλ€.
- μνμ μ€ν°μ»€ λͺ¨μμ μν΄ sticker λ°°μ΄μ 첫 λ²μ§Έ μμμ λ§μ§λ§ μμκ° μλ‘ μ°κ²°λμ΄μλ€κ³ κ°μ£Όν©λλ€.
μ μΆλ ₯ μ
[14, 6, 5, 11, 3, 9, 2, 10] | 36 |
[1, 3, 2, 5, 4] | 8 |
βοΈ νμ΄
κ³ λ―Όμ μ λ§ λ§μ΄ νλ€. μ²μμλ λͺ¨λ κ²½μ°λ₯Ό νμν΄μΌνλ? DFSλ‘ λλ €λ΄μΌνλ μͺ½μΌλ‘ μ κ·Όνμ§λ§ sticker λ°°μ΄μ κΈΈμ΄κ° 100,000μ΄ λλ€λ©΄ λΉμ°νκ² μκ°μ΄κ³Όλ‘ μ΄μ΄μ§ κ² κ°μ μλνμ§ μμλ€. κ²°κ΅ DPλ‘ μ κ·Όνλ€. νλμ μ€νΈμ»€λ₯Ό λ―μΌλ©΄ μ μμ μ€ν°μ»€λ₯Ό λ―μ§ λͺ»νκ² λμ΄ μ΄λ² μ€ν°μ»€λ₯Ό λ―λ κ²½μ°(dp[i-2] + sticker[i])μ μ λ―λ κ²½μ°(dp[i])λ₯Ό λΉκ΅νλ€. λ°°μ΄μ κΈΈμ΄λ§νΌ μ§ννλ©΄ λ§μ§λ§ μμκ° μ΅λκ°μ΄ λλ€.
dp[i] = i + 1 λ²μ§ΈκΉμ§ μ§ννμ λμ μ΅λκ°
μ²μμλ 1 * n κΈΈμ΄μ λ°°μ΄λ‘ μ κ·Όνλλ° μ²« λ²μ§Έ μ€ν°μ»€λ₯Ό λ―κ³ μλ―κ³ μ λ°λΌ μ°¨μ΄κ° λ μ λ°μ μλ€λ μ¬μ€μ μκ² λμλ€. i-2μ μμμ λΉκ΅νκΈ° μν΄ μνν λ iμ μ΄κΈ°κ°μ΄ 2λ‘ μμνλλ° μ΄κΈ°κ° μ ν ν λ κ°μ λ€λ₯΄κ² λ£μ΄μ€μΌ νλ€. 첫 λ²μ§Έλ₯Ό λ―μμ κ²½μ° dp[0], dp[1]μ μ΅λκ°μ΄ sticker[0]μ΄ λκ³ , λ―μ§ μμμ κ²½μ° dp[0]μ 0, dp[1](λ λ²μ§Έλ₯Ό λ―μ μ΅λκ°)μ sticker[1]μ΄ λκΈ° λλ¬Έμ΄λ€. λ°λΌμ dpλ°°μ΄μ 2 * nμΌλ‘ μ ν νκ³ λ§μ§λ§μ λΉκ΅νλ€.
μΆκ°μ μΌλ‘ λ°λ³΅λ¬Έ λ΄μμ Math.maxλ₯Ό μ¬μ©νμλλ° ν¨μ¨μ±ν μ€νΈμμ 2κ° μΌμ΄μ€κ° μκ°μ΄κ³Όκ° λ¬λ€. μΌνμ°μ°μλ‘ λ³κ²½νλ ν΄κ²°λ¬λ€.(μκ°λ³΄λ€ Math.max λ©μλκ° λλ¦° κ² κ°λ€.)
β¨οΈ μ½λ
function solution(sticker) {
var answer = 0;
const len = sticker.length;
if (len <= 1) return sticker[0];
const dp = [...Array(2)].map(_ => new Array(len).fill(0));
dp[0][0] = sticker[0];
dp[0][1] = sticker[0];
dp[1][1] = sticker[1];
for (let i = 2; i < len; i++) {
dp[0][i] = dp[0][i - 2] + sticker[i] > dp[0][i - 1] ? dp[0][i - 2] + sticker[i] : dp[0][i - 1];
dp[1][i] = dp[1][i - 2] + sticker[i] > dp[1][i - 1] ? dp[1][i - 2] + sticker[i] : dp[1][i - 1];
}
answer = Math.max(dp[0][len - 2], dp[1][len - 1]);
return answer;
}