카테고리 없음

[프로그래머스] 땅따먹기

90000e 2025. 5. 29. 17:55

문제

아래로 내려가면서 점수를 가장 많이 얻을 수 있는 경우를 찾는 것이다. 하지만 같은 열을 반복해서 밟을 수는 없다.

 


풀이방법

풀이 시간 : 30분

풀이 방법 : DP

 

맨 처음에는 0번째 행에서 제일 큰값을 찾아서 아래에서 같은 열이 아닌것 중 가장 큰걸 찾으면 되는 줄 알았다.

근데 생각해보니 0번째 행에서 선택되는 값에 따라 달라진다는걸 알 수 있었다.

 

예를 들어,

1 2 9 10
8 7 9 11
5 4 8 8
2 3 4 4

 

라는 그래프가 있을때 내가 맨처음에 생각했던 방식은 위와 같다고 생각했는데,

 

1 2 9 10
8 7 9 11
5 4 8 8
2 3 4 4

위와같은 방식의 점수합이 더 크다는걸 알 수 있었다.

그래서 DP를 생각했고, 그냥 1번째 행부터 현재 0,1,2,3열에서 바로 윗 행의 가장 큰값을 더해오면 된다.

 

1행 0열에서 자신과 열이같은 바로 윗 점수를 제외하고 나머지 3개 중 최댓값을 더한다.

1행 1열도 동일하게 구한다.

이런식으로 구해나아가면 최종적으로 마지막에 최댓값을 구할 수 있다. 


코드

import java.util.*;
import java.io.*;

class Solution {
    int solution(int[][] land) {
        int size = land.length;
        
        for(int i = 1; i < size; i++){
            land[i][0] += Math.max(land[i-1][1], Math.max(land[i-1][2], land[i-1][3]));
            land[i][1] += Math.max(land[i-1][0], Math.max(land[i-1][2], land[i-1][3]));
            land[i][2] += Math.max(land[i-1][0], Math.max(land[i-1][1], land[i-1][3]));
            land[i][3] += Math.max(land[i-1][0], Math.max(land[i-1][1], land[i-1][2]));
        }
        
        int max = Math.max(land[size-1][0], Math.max(land[size-1][1], Math.max(land[size-1][2], land[size-1][3])));
        
        return max;
    }
}