알고리즘/백준

정수 삼각형 - 파이썬 (DP)

cafe-jun12 2022. 5. 15. 20:47
반응형

백준 사이트 링크 : https://www.acmicpc.net/problem/1932

프로그래머스 링크 : https://programmers.co.kr/learn/courses/30/lessons/43105

문제는 아래와 같습니다.

문제

        7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5

위 그림은 크기가 5인 정수 삼각형의 한 모습이다.

맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.

삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.

입력

  • 첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

출력

  • 첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.

문제 해결 포인트 

  • 삼각형 자체가 DP 테이블이 되어 문제를 풀어 가는 방식입니다. 
  • 두번째 줄부터 시작을해 왼쪽 위,자신위 등을 체크해서 문제를 풀어가면 쉽게 풀어갈수있습니다. 
  • 2번째 줄부터 전줄에 있는 자기자신 + 왼쪽위,  자기자신 + 자신위 갑중 큰값을 넣으면 됩니다. 

 

정답코드 

n = int(input())
triangles = []
for _ in range(n):
    triangles.append(list(map(int,input().split())))
    
for i in range(1,n):
    for j in range(i+1):
        if j == 0:
            up_left = 0
        else:
            up_left = triangles[i-1][j-1]
        
        if i == j:
            up = 0
        else:
            up = triangles[i-1][j]
        triangles[i][j] = triangles[i][j] + max(up,up_left)
        
print(max(triangles[n-1]))

 

반응형