198. House Robber

  • 각 집에 μœ„μΉ˜ν•œ 돈의 μ•‘μˆ˜κ°€ λ°°μ—΄ nums 둜 μ£Όμ–΄μ‘Œμ„ λ•Œ 도둑이 νšλ“ν•  수 μžˆλŠ” κ°€μž₯ λ§Žμ€ μ•‘μˆ˜λ₯Ό κ΅¬ν•˜λŠ” 문제. 단, μ—°μ†λœ 2개의 집을 λ°©λ¬Έν•˜κ²Œλ˜λ©΄ 경보 μ‹œμŠ€ν…œμ΄ μšΈλ €μ„œ 작힐 수 μžˆλ‹€.
  • κ²°κ΅­ ν˜„μž¬ 집을 λ°©λ¬Έν–ˆμ„ λ•Œ λ„λ‘‘μ˜ μ„ νƒμ§€λŠ” 두가지가 λœλ‹€.
    • 이전 집을 λ°©λ¬Έ robbed = 1 ν–ˆλ‹€λ©΄, ν˜„μž¬ μ§‘μ—μ„œ λˆμ„ νšλ“ν•  수 μ—†κ³  κ±΄λ„ˆλ›΄ κ²ƒμœΌλ‘œ ν‘œμ‹œ robbed = 0 ν•΄μ•Ό ν•œλ‹€.
    • 이전 집을 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€ robbed = 0λ‹€λ©΄, ν˜„μž¬ μ§‘μ—μ„œ 돈 nums[index] 을 νšλ“ν•˜κ³  μƒνƒœλ₯Ό ν‘œμ‹œ robbed = 1 ν•œλ‹€.
  • μƒνƒœ 값을 이전 μ§‘μ˜ λ°©λ¬Έ μ—¬λΆ€ robbed = 0 or 1 및 μœ„μΉ˜ index 에 따라 μ €μž₯ dp[robbed][index] ν•˜κ³  이미 κ³„μ‚°λœ 값은 λ‹€μ‹œ κ³„μ‚°ν•˜μ§€ μ•Šκ³  ν™œμš©ν•œλ‹€.
class Solution { int traverse(int[] nums, int[][] dp, int index, int robbed) { if (index >= nums.length) return 0; if (dp[robbed][index] != -1) return dp[robbed][index]; int result = traverse(nums, dp, index + 1, 0); if (robbed == 0) { result = Math.max( result, traverse(nums, dp, index + 1, 1) + nums[index]); } return dp[robbed][index] = result; } public int rob(int[] nums) { int[][] dp = new int[2][nums.length]; Arrays.fill(dp[0], -1); Arrays.fill(dp[1], -1); return traverse(nums, dp, 0, 0); } }