ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ 프로그래머스 ] 정수 삼각형 (JAVA )
    자료구조 & 알고리즘/Programmers 2022. 6. 12. 19:20

    https://programmers.co.kr/learn/courses/30/lessons/43105

     

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

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

    programmers.co.kr

     

     

    📌 문제

     

    위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.

    삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.

     

     

    📌 제한 사항

    • 삼각형의 높이는 1 이상 500 이하입니다.
    • 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.

     

    📌 풀이

     

    📍 DP 를 통한 풀이

    • 메모이제이션 형태 
      • 이차원 배열
    • 점화식
      • 기본 아이디어를 통한 점화식 설명
        • dp[row][colum] = max(dp[ row -1 [ colum -1 ] , dp[ row-1 ][ colum ]) + triangle[row][colum]
        • 모든 위치에 대해 검사하되, 어떤 줄기에서 선택되어 내려왔을 때 최대값을 가질 수 있는지를 확인
        • 현재 위치에서 도달 했을때 오른쪽 위에서 내려 오는것 혹은 왼쪽 위에서 내려오는것 중 누적 큰값을 내는 것을 선택
      • 상세 점화식
        • 가장 왼쪽 값
          • dp[row][colum] = dp[ row-1 ] [ colum -1 ] + triangle[row][colum]
          • 가장 왼쪽을 통해서 내려오는 방법 밖에는 없음
        • 가장 오른쪽 값
          • dp[row][colum] = dp[ row-1 ] [ colum ] + triangle[row][colum]
          • 가장 오른쪽을 통해서 내려오는 방법 밖에는 없음
        • 그외 (중간)
          • dp[row][colum] = max(dp[ row -1 [ colum -1 ] , dp[ row-1 ][ colum ]) + triangle[row][colum]
    • 그외 포인트
      • dp 문제를 풀다 보면 특히 배열을 많이 다루게 되고 NPE 를 많이 경험하게된다. 포문의 범위, 경계값에 대해 잘 생각해보자
    import java.util.*;
    import static java.lang.Math.*;
    
    class Solution {
        public int solution(int[][] triangle) {
            
            int[][] dp = new int[triangle.length][triangle.length];
            dp[0][0] = triangle[0][0];
    
            for (int i = 1; i < triangle.length; i++) {
                for (int j = 0; j < i+1; j++) {
                  
                    if (j == 0) dp[i][j] = triangle[i][j] + dp[i - 1][j];
                    else if(j == triangle[i].length-1) dp[i][j] = triangle[i][j] + dp[i - 1][j-1];
                    else {
                        dp[i][j] = triangle[i][j] + max(dp[i - 1][j - 1], dp[i - 1][j]);}
                }
            }
            int maxValue = 0;
            for (int i = 0; i < dp.length; i++) {
                maxValue = max(maxValue, dp[dp.length - 1][i]);
            }
            return maxValue;
        }
    }

    댓글

Designed by Tistory.