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

가온·2022년 12월 14일
0

[Lv.3] 정수삼각형

문제설명


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

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

제한사항

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

입출력 예

나의 풀이

📍접근

언어 : Java
접근 : 이 문제에서는 대각선 방향으로 내려오며 숫자를 더하여 큰 값을 찾는 것이다.
전체가 아니라 작은 삼각형으로 쪼개어 위의 값들을 더해서 내려오면서 계산하여 큰 값을 찾는다. 따라서 dpT라는 dp를 이용할 정삼각형 배열을 만들어 가장 왼쪽 원소는 윗줄의 가장 왼쪽 값만을 더하고, 가장 오른쪽 원소는 윗줄의 가장 오른쪽 값만을 더하고, 중간의 원소들은 대각선 왼쪽 dpT[i-1][j-1]과 오른쪽 dpT[i-1][j] 중 큰 값을 더해서 저장해주고, 마지막 줄의 값 중 가장 큰 값을 결과값으로 도출한다.

📍코드

class Solution {
    public int solution(int[][] triangle) {
        int answer = 0;
        int[][] dpT = new int [triangle.length][triangle.length];
        dpT[0][0] = triangle[0][0];
            
        for(int i = 1; i < triangle.length; i++){
            //왼쪽 끝 원소의 경우 : 윗 줄의 왼쪽 끝 원소만 더해준다.
            dpT[i][0] = dpT[i-1][0] + triangle[i][0];
            for(int j = 1; j < i; j++){
                //가운데 원소의 경우 :  윗줄의 대각선 왼쪽과 오른쪽 값 중 큰 값을 더해준다.
                dpT[i][j] = Math.max(dpT[i-1][j-1], dpT[i-1][j]) + triangle[i][j];
            }
            //오른쪽 끝 원소의 경우 : 윗줄의 오른쪽 끝 원소만 더해준다.
            dpT[i][i] = dpT[i-1][i-1] + triangle[i][i];
        }
        
        for(int i = 0; i< dpT.length; i++){
            answer = Math.max(answer, dpT[triangle.length - 1][i]);
        }
        return answer;
    }
}

📍결과

📍메모

DP (다이내믹 프로그래밍)은 다음과 같은 경우에 사용한다.

  • 큰 문제를 작은 문제로 분할하여 해결
  • 작은 문제는 반복되지 않고 풀 때마다 같은 답이 나옴
  • 작은 문제의 답을 저장해놓는다 : Memoziation (Top-down 방식) / 상향식 계산법 (Bottom-up 방식)

이 문제에서는 대각선 방향으로 내려오며 숫자를 더하여 큰 값을 찾는 것이다.
전체가 아니라 작은 삼각형으로 쪼개어 위의 값들을 더해서 내려오면서 계산하여 큰 값을 찾는다.

정삼각형이라는 조건이 있었기 때문에 코드를 작성했을 때 trinagle[i].length 가 결국 i+1 이 된다는 사실을 인지하고 작성한다. 예를 들면, triangle[1].length 는 두번째 줄로 2이다.

profile
코딩기딩기딩기딩

0개의 댓글