[문제]
코딩테스트 연습 - 땅따먹기 | 프로그래머스 스쿨 (programmers.co.kr)
[문제 풀이]
dp 테이블을 만들어서 0번째는 1,2,3 중에서 제일 큰걸, 1번째는 0,2,3중에서 제일 큰걸 .... 이렇게 3번까지 반복하면서 계속해서 1번 행부터 n -1 번(n번은 index가 밖이니까) 까지 내려가자.
[회고]
특별히 어려운 점은 없었다. 다만, 오랜만에 switch문을 써서 풀었다. 예전에 정처기에서 switch문 case들 마다 밑에 break 있어야 한다는걸 까먹어서 틀렸던 기억이 나는데 switch 문에서 밑에 break를 두는걸 잊지 말자.
[코드]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int dp[100001][5];
int solution(vector<vector<int> > land)
{
int answer = 0;
int max_temp = 0;
for(int i = 0;i<land.size();i++){
for(int j = 0;j<4;j++){
dp[i][j] = land[i][j];
}
}
if(land.size() == 1){
max_temp = 0;
max_temp = max(land[0][1],land[0][2]);
max_temp = max(max_temp,land[0][3]);
answer = max_temp;
return answer;
}
for(int i = 0;i<land.size();i++){
for(int j = 0;j<4;j++){
switch(j) {
case 0:
max_temp = 0;
max_temp = max(dp[i - 1][1],dp[i - 1][2]);
max_temp = max(max_temp,dp[i - 1][3]);
dp[i][0] += max_temp;
break;
case 1:
max_temp = 0;
max_temp = max(dp[i - 1][0],dp[i - 1][2]);
max_temp = max(max_temp,dp[i - 1][3]);
dp[i][1] += max_temp;
break;
case 2:
max_temp = 0;
max_temp = max(dp[i - 1][1],dp[i - 1][0]);
max_temp = max(max_temp,dp[i - 1][3]);
dp[i][2] += max_temp;
break;
case 3:
max_temp = 0;
max_temp = max(dp[i - 1][1],dp[i - 1][2]);
max_temp = max(max_temp,dp[i - 1][0]);
dp[i][3] += max_temp;
break;
}
}
}
max_temp = 0;
max_temp = max(dp[land.size() - 1][1],dp[land.size() - 1][2]);
max_temp = max(max_temp,dp[land.size() - 1][3]);
max_temp = max(max_temp,dp[land.size() - 1][0]);
answer = max_temp;
return answer;
}