[ 다먹살 ]/- Coding

[프로그래머스] 레벨3 정수 삼각형

엉망으로살기 2021. 9. 24. 10:04
반응형

https://programmers.co.kr/learn/courses/30/lessons/43105?language=java 

 

코딩테스트 연습 - 정수 삼각형

[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] 30

programmers.co.kr

 

DP 문제의 특징은 한 번 규칙성을 발견하면 코드로 구현하기는 생각보다 어렵지 않다는 것 같다. 이 문제 같은 경우에도 삼각형의 생김새를 배열과 연관지어서 생각하는 게 좀 낯설었지만, 막상 구현은 간단한 문제였다.

 

1. 최대 크기만큼 memoization할 배열(dp)을 만든다.

2. 인덱스를 3개의 경우로 나눠 dp배열의 값들을 채워나간다.

   2-1. 각 줄의 맨 왼쪽일 경우 : 바로 윗 줄의 같은 인덱스 값만 선택

   2-2. 각 줄의 맨 왼쪽일 경우 : 바로 윗 줄의 인덱스-1한 값만 선택

   2-3. 각 줄의 맨 오른쪽일 경우 : 바로 윗 줄의 같은 인덱스, 인덱스-1한 값 중 최대값을 선택

3. 맨 마지막 줄에 계산된 값 중, 가장 큰 값을 결과 출력한다.

 


문제 및 입출력

 


코드

class Solution
{
    public int solution(int[][] triangle)
    {
        // 최대 크기로 dp배열 설정
        int[][] dp = new int[triangle.length][triangle[triangle.length-1].length];
        // 초기값 설정(배열 맨 위)
        dp[0][0] = triangle[0][0];
        
        for(int i=1; i<triangle.length; i++)
        {
            for(int j=0; j<triangle[i].length; j++)
            {
                // 각 줄의 맨 왼쪽일 경우 : 바로 윗 줄의 같은 인덱스 값만 선택
                if(j==0)
                {
                    dp[i][j] = triangle[i][j] + dp[i-1][j];
                }
                // 각 줄의 맨 왼쪽일 경우 : 바로 윗 줄의 인덱스-1한 값만 선택
                else if(j==triangle[i].length-1)
                {
                    dp[i][j] = triangle[i][j] + dp[i-1][j-1];
                }
                // 각 줄의 맨 오른쪽일 경우 : 바로 윗 줄의 같은 인덱스, 인덱스-1한 값 중 최대값을 선택
                else
                {
                    dp[i][j] = triangle[i][j] + Math.max(dp[i-1][j], dp[i-1][j-1]);
                }
            }
        }
        
        // 맨 마지막 줄에 대해 최대값을 비교한 후 출력
        int answer = Integer.MIN_VALUE;
        
        for(int j=0; j<dp[dp.length-1].length; j++)
        {
            answer = Math.max(dp[dp.length-1][j], answer);
        }
        
        return answer;
    }
}

 

반응형