BOJ : 정수 삼각형 [1932]

재현·2021년 4월 4일
0

1. 문제


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

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

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

출처 : https://www.acmicpc.net/problem/1932

2. 아이디어


  • dp
    1. 입력을 리스트로 받는다.
      [7]
      [3,8]
      [8,1,0]
      [2,7,4,4]
      [4,5,2,6,5]
    2. 위에서 대각선아래와 더하며 내려온다.
      [7]
      [10,15]
    3. 겹치는 부분은 최대가 되도록 max()를 사용한다.
      [7]
      [10,15]
      [18,max([11],[16]),15]
    4. 반복하면 마지막 줄에 가장 큰 값으로 채워진다.

3. 코드


clone

n = int(input()) 
arr = [list(map(int,input().split())) for _ in range(0,n)] 
dp=[] 
for i in range(1,n): 
  for j in range(len(arr[i])): 
    if j == 0 : 
      arr[i][j] += (arr[i-1][j]) 
    elif j==i: 
      arr[i][j] +=(arr[i-1][j-1]) 
    else : 
      arr[i][j] += (max(arr[i-1][j],arr[i-1][j-1])) 
print(max(arr[n-1]))

출처 : https://pannchat.tistory.com/entry/%EB%B0%B1%EC%A4%80-1932-%EC%A0%95%EC%88%98%EC%82%BC%EA%B0%81%ED%98%95-%ED%8C%8C%EC%9D%B4%EC%8D%AC

profile
성장형 프로그래머

0개의 댓글