• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

Dp HouseRobber 질문

21.03.08 03:01 작성 조회수 141

1

안녕하세요. DP문제를 풀어보는데 있어,

다른 응용문제를 보고 풀다가 단위케이스에 걸려

문의드립니다.

릿코드에서는 정상적으로 통과 되었지만,

이 문제와 동일한 프로그래머스 사이트에 "도둑질" 문제에서는 단위케이스 걸려 실패하였습니다.. ㅠㅠ

아래에 링크 첨부 드립니다.

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

기존 문제는 제가 아래와 같이 풀었으나

선생님 공식과 조금 다른것 같아, 혹시 문제 유형이 다른건지

 헷갈리기 시작했습니다. ㅠ

public int solution(int[] money) {
int moneyLength = money.length;
// dp배열은 처음 집을 훔치기때문에 인접한 마지막 집은 훔칠수 없으므로 반복문은 length-1 전까지만
int[] dp = new int[moneyLength-1];
// 처음 집 안 훔칠 때
int[] dp2 = new int[moneyLength];

// dp[0] dp[1] 0번째 집부터 1번째 집까지 가장 많이 훔칠수 있는 금액인데 0번집을 훔치기때문에
// 1번째 집은 훔칠수 없게 되고 dp[1]까지의 가장큰 금액은 첫번째 집을 훔친 경우이므로 dp[0],dp[1]에는 0번 집의 돈을 넣어 줬습니다.
dp[0] = money[0];
dp[1] = money[0];
dp2[2] = 0;
dp2[1] = money[1];

// 반복문을 돌면서 두번째 전의 최대 돈에 현재 번째 집의 돈을 합친것과 이전의 최대 돈을 비교하여 dp배열을 채웁니다.
// 2가지 경우를 각각 money 배열의 인덱스만큼 왔을 때 누적시킨 dp값들의 max 값을 구하여 메모제이션 해줌
for (int i = 2; i < moneyLength-1; i++) {
dp[i]=Math.max(dp[i-2]+money[i],dp[i-1]);
}

// dp2는 첫번째 집에서는 돈을 훔치지 않으므로 반복문은 length까지 돌렸습니다.
for(int i=2; i<moneyLength; i++) {
dp2[i]=Math.max(dp2[i-2]+money[i],dp2[i-1]);
}

// dp dp2의 마지막 값을 비교하여 더 큰값을 출력 하여 정답을 구하였습니다.
return Math.max(dp[moneyLength-2],dp2[moneyLength-1]);
}

답변 1

답변을 작성해보세요.

1

안녕하세요~

네 이건 문제 유형이 다릅니다.

제가 푼건 집이 고리처럼 연결되지 않았습니다.

올려주신 문제는 고리처럼 연결이 되어 있어서, 

경우의 수를 2개를 가지고 갔기때문에  저장 공간(dp[]) 를 2개 만든겁니다.

public int solution(int[] money) {

        int answer = 0;

        int n = money.length;

        int[] dp1 = new int[n];

        dp1[0] = money[0];

        dp1[1] = dp1[0];

        for(int i = 2; i < n-1; i++) {

            dp1[i] = Math.max(dp1[i-1], dp1[i-2] + money[i]);

        }

        int[] dp2 = new int[n];

        dp2[0] = 0;

        dp2[1] = money[1];

        for(int i = 2; i < n; i++) {

            dp2[i] = Math.max(dp2[i-1], dp2[i-2] + money[i]);

        }

        answer = Math.max(dp1[n-2], dp2[n-1]); 

        return answer;

    }