[문제 바로가기] https://programmers.co.kr/learn/courses/30/lessons/43105
📌문제 설명
위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다.
아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다.
예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.
삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.
제한사항
- 삼각형의 높이는 1 이상 500 이하입니다.
- 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.
입출력 예
triangle | result |
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] | 30 |
💡문제 풀이
프로그래머스 Level 2에 있는 '땅따먹기'와 유사한 문제다.
단, 열의 개수가 행이 증가할 때 마다 1씩 증가하는 삼각형 형태이며
아래 칸으로 이동시 왼쪽 또는 오른쪽으로만 이동이 가능하다.
따라서, 기본적인 알고리즘 풀이방법은 DP를 이용하였고 아래 칸으로 이동시 진행하는 덧셈(왼쪽, 오른쪽)은 인덱스를 이용하여 해결하였다.
- height : 행 (1 ~ len(triangle)-1)
- step : 열 (0 ~ height)
※ 열의 개수는 행의 개수와 같다.
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])
'Algorithm > Programmers' 카테고리의 다른 글
[Algorithm] Programmers : 최고의 집합 by Python (0) | 2020.12.27 |
---|---|
[Algorithm] Programmers : 이중우선순위큐 by Python (0) | 2020.12.26 |
[Algorithm] Programmers : 단어변환 by Python (0) | 2020.12.24 |
[Algorithm] Programmers : 네트워크 by Python (0) | 2020.12.23 |
[Algorithm] Programmers : 베스트앨범 by Python (0) | 2020.12.23 |
댓글