프로그래머스

LV2 땅따먹기 (Java)

whiporithm 2023. 12. 21. 21:22

 


 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12913

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

단순한(?) dp(?)문제다.

 

위에서 아래로 내려오고, 같은 열의 값은 밞을 수 없다는 조건을 생각해서 dp 2차원 배열을 갱신해주면 된다.

 

dp배열의 값은 "현재 칸에 올 경우 가장 큰 값" 을 정의한다.

 

따라서 점화식은 dp[행][열] = (land[행][열]) + dp(이전 행 중 가장 큰 값) 

 

위처럼 구성되고, dp(이전 행 중 가장 큰 값)  <= 여기서 같은 열은 제외해주면 된다.

 

코드가 이해가 훨씬 쉬울거라고 생각한다.

 

코드

class Solution {
    int solution(int[][] land) {
        int answer = 0;
        int r = land.length;
        
        // initialize
        int d[][] = new int[r][4];
        for(int i=0; i<4; i++) d[0][i] = land[0][i];
        
        for(int i=1; i<r; i++){
            for(int j=0; j<4; j++){
                if(j==0) d[i][j] = land[i][j] + Math.max(Math.max(d[i-1][1], d[i-1][2]),d[i-1][3]);
                if(j==1) d[i][j] = land[i][j] + Math.max(Math.max(d[i-1][0], d[i-1][2]),d[i-1][3]);
                if(j==2) d[i][j] = land[i][j] + Math.max(Math.max(d[i-1][1], d[i-1][0]),d[i-1][3]);                
                if(j==3) d[i][j] = land[i][j] + Math.max(Math.max(d[i-1][1], d[i-1][2]),d[i-1][0]);      
            }
        }
        
        for(int i=0; i<4; i++) answer = Math.max(answer, d[r-1][i]);

        return answer;
    }
}

 

후기

 

 

'프로그래머스' 카테고리의 다른 글

LV2 - 다리를 지나는 트럭 (Java)  (0) 2024.06.26
LV2 - 숫자 변환하기 (Java)  (0) 2024.06.25
LV2 뒤에 있는 큰 수 찾기 (Java)  (1) 2023.12.21
LV3 단어 변환 (Java)  (1) 2023.11.24
LV3 모음사전 (Java)  (1) 2023.11.23