[Programmers] 땅따먹기

2023. 9. 5. 22:23Computer Sciences/Problem Solve

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

 

프로그래머스

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

programmers.co.kr

문제 설명

DP 문제이다. 처음에 완전 탐색으로 재귀를 활용하여 풀었떠니 모든 케이스에서 시간 초과가 발생했다. 이를 DP를 활용하여 해결하였다.

DP

class Solution {
    public int solution(int[][] land) {
        int answer = 0;
        int[][] dp = new int[land.length][land[0].length];
        
        for (int col = 0; col < land[0].length; col++) {
            dp[0][col] = land[0][col];
        }
        
        for (int row = 1; row < land.length; row++) {
            for (int col = 0; col < land[0].length; col++) {
                for (int prevCol = 0; prevCol < land[0].length; prevCol++) {
                    if (col != prevCol) {
                        dp[row][col] = Math.max(dp[row][col], dp[row - 1][prevCol] + land[row][col]);
                    }
                }
            }
        }
        
        for (int col = 0; col < land[0].length; col++) {
            answer = Math.max(answer, dp[land.length - 1][col]);
        }
        
        return answer;
    }
}

재귀 (시간 초과)

class Solution {
    private int answer;
    
    int solution(int[][] land) {
        for (int col = 0; col < 4; col++) {
            recur(land, 0, col, 0);
        }
        
        return answer;
    }
    
    private void recur(int[][] land, int row, int prevCol, int sum) {
        if (row == land.length) {
            answer = Math.max(answer, sum);
            return;
        }
        
        for (int col = 0; col < 4; col++) {
            if (col != prevCol) {
                recur(land, row + 1, col, sum + land[row][col]);
            }
        }
    }
}

'Computer Sciences > Problem Solve' 카테고리의 다른 글

[Programmers] 뒤에 있는 큰 수 찾기  (0) 2023.09.06
[Programmers] 스킬트리  (0) 2023.09.05
[Programmers] 게임 맵 최단거리  (0) 2023.09.05
[Programmers] 모음사전  (0) 2023.09.04
[Programmers] 더 맵게  (0) 2023.09.04