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];
}
}
'알고리즘 > DP' 카테고리의 다른 글
백준 1309번 동물원[JAVA] (4) | 2025.08.12 |
---|---|
프로그래머스 - 멀리 뛰기[Java] (0) | 2025.02.14 |
프로그래머스 - 등굣길[Java] (0) | 2025.02.07 |
프로그래머스 - 정수 삼각형 (0) | 2025.02.05 |