👀 문제
https://programmers.co.kr/learn/courses/30/lessons/12913
👊 도전
1. 설계
- DP를 이용한다.
- 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. 설명
- 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를 선택하여 리턴한다.