위와 같이 동적으로 계산하면, 불필요한 n!의 계산을 하지 않고, O(n)으로 알뜰하게 계산이 된다.
def solution(triangle):
# 반복문을 통해, 한 줄씩 가장 큰 경우를 계산해 나간다.
for i in range(len(triangle)-1):
prev = triangle[i]
now = triangle[i+1]
for j in range(i+2):
# 왼쪽 끝이면, 이전 줄의 왼쪽 끝을 따라 누계
if j == 0: now[j] += prev[0]
# 오른쪽 끝이면, 이전 줄의 오른쪽 끝을 따라 누계
elif j == i+1: now[j] += prev[i]
# 양끝이 아니면, 좌측상단과 우측상단 중 더 큰 값을 따라 누계
else: now[j] += max(prev[j-1], prev[j])
# 마지막 줄에서 제일 큰 값을 반환
return max(triangle[-1])