[JAVA/프로그래머스] 연습문제: 땅따먹기

👀 문제

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

👊 도전

1. 설계

  1. DP를 이용한다.
  2. dp[i][j]=max(dp[i-1][j] 빼고 나머지 dp[i-1][])+land[i][j]

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.util.*;
/**
 *
 * @author HEESOO
 *
 */
class Solution {
    /**
        dp[][]이용
        dp[i][j]+=Math.max(dp[i-1])
        dp[0][0]~[0][3]은 원래값으로 초기화
        dp[1][0]=(0,1)+(0,2)+(0,3)
        dp[1][1]=(0,0)+(0,2)+(0,3)
        4개밖에 안되니까 
        for i 돌리고 안에서 (i,0)~(i,3) 다쓰기
        max=dp[n-1][0]~[3]까지의 최댓값
    */
    int solution(int[][] land) {
        int answer = 0;
        int n=land.length;
        int[][] dp=new int[n][4];
        for(int j=0;j<4;j++){ // 초기화
            dp[0][j]=land[0][j];
        }
        for(int i=1;i<n;i++){ // DP 계산
            dp[i][0]=Math.max(dp[i-1][1], Math.max(dp[i-1][2], dp[i-1][3]))+land[i][0];
            dp[i][1]=Math.max(dp[i-1][0], Math.max(dp[i-1][2], dp[i-1][3]))+land[i][1];
            dp[i][2]=Math.max(dp[i-1][0], Math.max(dp[i-1][1], dp[i-1][3]))+land[i][2];
            dp[i][3]=Math.max(dp[i-1][0], Math.max(dp[i-1][1], dp[i-1][2]))+land[i][3];
        }
        
        // 마지막 행에서 max 값 선택
        answer=Math.max(dp[n-1][0], Math.max(dp[n-1][1], Math.max(dp[n-1][2], dp[n-1][3])));
        return answer;
    }
}

3. 결과

실행결과 🤟 성공 🤟
처음 예제를 보고 행 별로 가장 큰 값을 선택하면 되는 줄 알았는데 아니었다.

4. 설명

  1. DP를 이용한다
    • dp[i][j]: (i, j)를 선택하는 경우 -> (i-1, j)는 선택하면 안됨
    • dp[i][j]=max(dp[i-1][j] 제외한 dp[i-1][])+land[i][j]
    • dp[0][0]~dp[0][4]는 land값과 같이 초기화한다.
    • 마지막에 dp[n-1][0]~dp[n-1][3]에서 max를 선택하여 리턴한다.

👏 해결 완료!