Problem
나는 강도고 배열은 내가 털 집의 돈을 순서대로 나타냅니다.
인접한 두 집을 동시에 털면 경찰에 알림이 가기 때문에 피해야 합니다.
하루에 훔칠 수 있는 가장 많은 돈을 구하는 문제입니다.
Solution
DP 로 해결할 수 있습니다.
dp
배열을 선언했다고 가정할 때 dp[i]
는 i
번까지의 집까지 도달했을 때 훔친 돈의 Max
값 이라고 생각하면 됩니다.
그럼 i
번째 집에서 도둑이 얻을 수 있는 Max
의 경우의 수는 다음 둘 중 하나입니다.
i - 2
번째 집까지 털었던 Max 값 +i
번째 집의 돈i - 1
번째 집까지 털었던 Max 값
이렇게 마지막 집까지 쭉 확인하고 남은 마지막 인덱스 값이 Max
값이 됩니다.
Java Code
class Solution {
public int rob(int[] nums) {
if (nums.length == 0) return 0;
if (nums.length == 1) return nums[0];
nums[1] = Math.max(nums[0], nums[1]);
for (int i = 2; i < nums.length; i++) {
nums[i] = Math.max(nums[i - 1], nums[i - 2] + nums[i]);
}
return nums[nums.length - 1];
}
}
Kotlin Code
class Solution {
fun rob(nums: IntArray): Int = when (nums.size) {
0 -> 0
1 -> nums.first()
else -> {
nums[1] = maxOf(nums[0], nums[1])
for (i in 2..nums.lastIndex) {
nums[i] = maxOf(nums[i - 1], nums[i - 2] + nums[i])
}
nums.last()
}
}
}
'알고리즘 문제 > LeetCode' 카테고리의 다른 글
[LeetCode Easy] Intersection of Two Linked Lists (Java) (0) | 2020.12.28 |
---|---|
[LeetCode Easy] Power of Three (Java) (0) | 2020.12.28 |
[LeetCode Easy] Plus One (Java) (0) | 2020.12.28 |
[LeetCode Easy] Count and Say (Java) (0) | 2020.12.28 |
[LeetCode Easy] Min Stack (Java) (0) | 2020.12.28 |