개발하는SM

[프로그래머스] 정수 삼각형 본문

Algorithm/DP

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

개발하는SM 2020. 11. 12. 22:32

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 이하의 정수입니다.

풀이

삼각형의 맨 아랫변 바로 위에 있는 층부터, 최댓값을 계산하면서 올라가면 풀 수 있는 문제이다.

 

아래 칸으로 이동할 때는 오른쪽 OR 왼쪽이므로, 

MAX(현재값 + 아래층 왼쪽 값,  현재값 + 아래층 오른쪽 값) 형태로 계산하면서 올라가면 되는 문제였다.

 

import java.util.*;

class Solution {
    public int solution(int[][] triangle) {
        int answer = 0;
        
        int dp[][] = new int[triangle.length][triangle.length];
        
        for(int i = 0; i<triangle.length; i++){
            for(int j=0; j<triangle[i].length; j++){
                dp[i][j] = triangle[i][j];
            }
        }
        
        for(int i = triangle.length-2; i>=0; i--){
            for(int j=0; j<=i; j++){
                dp[i][j] = Math.max(dp[i][j] + dp[i+1][j], dp[i][j] + dp[i+1][j+1]);
                //System.out.println(i + ", " + j + " = " + dp[i][j] );
            }
        }
    
        answer = dp[0][0];
        
        return answer;
    }
}

 

 

'Algorithm > DP' 카테고리의 다른 글

[프로그래머스] 등굣길  (0) 2020.11.12
[프로그래머스] 도둑질  (0) 2020.11.12
[프로그래머스] N으로 표현  (0) 2020.11.09