알고리즘/DP
프로그래머스 - 땅따먹기[Java]
연향동큰손
2025. 2. 13. 17:25
https://school.programmers.co.kr/learn/courses/30/lessons/12913
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
이 문제에서 가장 중요한점은 dp배열을 이용하여 각 위치에서 내려갈때 최대값을 저장하고 그 값들을 이용하여 중복 계산을 방지하는 것이다.
import java.util.*;
class Solution {
public static int answer = 0;
public static int[][] dp;
int solution(int[][] land) {
dp=new int[land.length][land[0].length];
for(int[] row : dp){
Arrays.fill(row,-1);
}
int answer = 0;
for (int i = 0; i < 4; i++) {
answer = Math.max(answer, dfs(land,i, 0));
}
return answer;
}
public int dfs(int[][] land, int w, int h){
if(h==land.length-1){
return land[h][w]; //가장 마지막행에 도달하면 더이상 내려갈 수 없으므로 현재 위치의 값을 반환
}
if(dp[h][w]!=-1){
return dp[h][w]; //전에 계산했던 값을 이용하여 최대값 반환
}
int max = Integer.MIN_VALUE;
for(int i=0; i<4; i++){
if(i!=w){ //바로 아래는 방문 못하므로 조건을 걸어줌
max=Math.max(dfs(land,i,h+1),max);
}
}
return dp[h][w]=max+land[h][w];
}
}