포스트

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

DP 기반 최대 합 계산 방식, 정수 삼각형 문제의 Python 및 Java 동일 로직 구현 방법

For the English version of this post, see here.
[Python] 프로그래머스 - 정수 삼각형

Programmers 정수 삼각형

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def solution(triangle):
    answer = 0
    
    for i in range(1, len(triangle)):
        for j in range(len(triangle[i])):
            if j == 0:
                triangle[i][j] += triangle[i-1][j]
            elif j == i:
                triangle[i][j] += triangle[i-1][j-1]
            else:
                triangle[i][j] += max(triangle[i-1][j-1], triangle[i-1][j])
    
    answer = max(triangle[-1])
    
    return answer

동적 계획법 (DP, Dynamic Programming)

큰 문제를 작은 문제들로 나누고, 이미 구한 작은 문제의 답을 저장해서 다시 사용하는 방식

  • 매번 처음부터 다시 계산하지 않고, 이미 구한 결과를 저장해두고 재사용하는 방법

  • 동적 계획법을 이용해서 위 문제 풀이를 진행하면서, ‘이 칸까지 도착했을 때 얻을 수 있는 최대 합’을 구하기 위해 triangle[i][j] = 맨 위에서 이 칸까지 오는 최대 합으로 triangle[i][j]의 의미를 바꿈

  • 자바에서도 동일하게 구현할 수 있음

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
      class Solution {
          public int solution(int[][] triangle) {
              for (int i = 1; i < triangle.length; i++) {
                  for (int j = 0; j < triangle[i].length; j++) {
    
                      if (j == 0) {
                          // 왼쪽 : 바로 위에서만 내려올  있음
                          triangle[i][j] += triangle[i - 1][j];
                      } 
                      else if (j == i) {
                          // 오른쪽 : 왼쪽 위에서만 내려올  있음
                          triangle[i][j] += triangle[i - 1][j - 1];
                      } 
                      else {
                          // 가운데: 왼쪽 , 오른쪽      선택
                          triangle[i][j] += Math.max(triangle[i - 1][j - 1], triangle[i - 1][j]);
                      }
                  }
              }
    
              int answer = 0;
    
              for (int i = 0; i < triangle[triangle.length - 1].length; i++) {
                  answer = Math.max(answer, triangle[triangle.length - 1][i]);
              }
    
              return answer;
          }
      }
    

댓글

궁금한 점, 피드백, 오류 제보를 남겨 주세요.