[leetcode #198] House Robber

Seongyeol Shin·2021년 12월 1일
0

leetcode

목록 보기
92/196
post-thumbnail

Problem

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security systems connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given an integer array nums representing the amount of money of each house, return the maximum amount of money you can rob tonight without alerting the police.

Example 1:

Input: nums = [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.

Example 2:

Input: nums = [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).
Total amount you can rob = 2 + 9 + 1 = 12.

Constraints:

・ 1 <= nums.length <= 100
・ 0 <= nums[i] <= 400

Idea

dp를 이용해 매 순간 상태에 따른 최대값을 저장하면 되는 문제다.

옆집을 같은 날에 터는 건 불가능하므로 집을 털 때마다 이전에 집을 털었는지 여부를 각각 검토해야 한다.
집을 털었을 때 최대값과 집을 털지 않았을 때 최대값을 각각 저장하고 모든 집을 다 조회한 뒤, 둘 중 더 큰 값을 리턴하면 된다.

Solution

class Solution {
    public int rob(int[] nums) {
        int[][] dp = new int[nums.length][2];
        // 0 → rob is not possible, 1 → rob is possible
        dp[0][0] = nums[0];

        for (int i=1; i < nums.length; i++) {
            dp[i][0] = dp[i-1][1] + nums[i];
            dp[i][1] = Math.max(dp[i-1][0], dp[i-1][1]);
        }

        return Math.max(dp[nums.length-1][0], dp[nums.length-1][1]);
    }
}

Reference

https://leetcode.com/problems/house-robber/

profile
서버개발자 토모입니다

0개의 댓글