CS & Algorithm/Algorithm

[Programmers:DP] 도둑질

eunkonge 2026. 7. 1. 12:43 댓글 0

❓문제

이웃한 집은 털 수 없다는 조건에서 도둑질했을 때 가장 많은 돈을 털 수 있는 방법

Return Max(도둑질 값)


🖐️손코딩

## 처음에 생각했던 방법
현재 위치 i에서 털 수 있는 집 중 가장 많은 돈을 보유한 집(leetcode 점프 게임과 유사한 방식)
-> Greedy 법으로 최적해를 보장하지 못함

dp[i] -> 0~i번째 집까지 고려했을 때 가능한 모든 경우의 돈의 합 중 최댓값

def rob()
	for(i:0~n)
		i를 터는 경우 : MAX(money[i], dp[i-2]+money[i])// dp[i-2]+Money[i] >= money[i] -> dp[i-2]+money[i]
    	i를 안터는 경우 : dp[i-1]
    	dp[i] = Max(dp[i-2]+money[i], dp[i-1])
    
def main()
	int a = rob() // 첫번째 집을 터는 경우
    int b = rob() // 첫번째 집을 털지 않는 경우
    
    return Max(a, b)

👩‍💻구현 코드

import java.util.*;

class Solution {
    private int rob(int[] money, int[] dp, int start, int end){
        dp[start] = money[start];
        dp[start+1] = Math.max(money[start], money[start+1]);
                               
        for(int i = start+2; i<=end; i++){
            if(i<2){
                dp[i] = money[i];
            } else {
                int a = money[i]+dp[i-2];
                int b = dp[i-1];
                dp[i] = Math.max(a, b);
            }
        }
        
        return dp[end];
    }
    
    public int solution(int[] money) {
        int answer = 0;
        int[] dp = new int[money.length];
        
        int a = rob(money, dp, 0, money.length-2);
        
        dp = new int[money.length];
        int b = rob(money, dp, 1, money.length-1);
        
        answer = Math.max(a, b);
        
        return answer;
    }
}

https://school.programmers.co.kr/learn/courses/30/lessons/42897

'CS & Algorithm > Algorithm' 카테고리의 다른 글

[BFS] 석유 시츄  (0) 2026.07.25
[Programmers:DFS/BFS] 여행경로  (0) 2026.07.06
[Programmers:DP] 사칙연산  (0) 2026.07.01
[Programmers:DP] 등굣길  (0) 2026.06.30
[Programmers:DP] N으로 표현  (0) 2026.06.30

많이 읽은 글