[문제 바로가기] https://programmers.co.kr/learn/courses/30/lessons/43105
위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.
제한사항
- 삼각형의 높이는 1 이상 500 이하입니다.
- 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.
입출력 예
프로그래머스 Level 2에 있는 '땅따먹기'와 유사한 문제다.
단, 열의 개수가 행이 증가할 때 마다 1씩 증가하는 삼각형 형태이며
아래 칸으로 이동시 왼쪽 또는 오른쪽으로만 이동이 가능하다.
따라서, 기본적인 알고리즘 풀이방법은 DP를 이용하였고 아래 칸으로 이동시 진행하는 덧셈(왼쪽, 오른쪽)은 인덱스를 이용하여 해결하였다.
step 1)
덧셈은 1행부터 triangle의 길이(n)-1 범위까지 진행한다.
※ 0번째 행은 변화가 없다.
step 2)
주어진 배열이 삼각형의 형태이므로 가장 왼쪽과 오른쪽은 한 번의 연산만 진행된다.
따라서, 다음과 같이 3가지로 구분하였다.
step 3)
마지막 행까지 덧셈을 마쳤으면 마지막 행(triangle[-1])의 최대값(max)을 return한다.
def solution(triangle):
n = len(triangle)
for height in range(1, n):
for step in range(height+1):
if step == 0:
triangle[height][step] += triangle[height-1][0]
elif step == height:
triangle[height][step] += triangle[height-1][step-1]
else:
triangle[height][step] += max(triangle[height-1][step-1], triangle[height-1][step])
return max(triangle[-1])