[Algorithm] Programmers : 정수 삼각형 by Python

엄희관·2020년 12월 23일
1

Algorithm

목록 보기
39/128
post-thumbnail

[문제 바로가기] https://programmers.co.kr/learn/courses/30/lessons/43105

📌문제 설명


위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.

삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.

제한사항

  • 삼각형의 높이는 1 이상 500 이하입니다.
  • 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.

입출력 예


💡 문제 풀이

프로그래머스 Level 2에 있는 '땅따먹기'와 유사한 문제다.
단, 열의 개수가 행이 증가할 때 마다 1씩 증가하는 삼각형 형태이며
아래 칸으로 이동시 왼쪽 또는 오른쪽으로만 이동이 가능하다.

따라서, 기본적인 알고리즘 풀이방법은 DP를 이용하였고 아래 칸으로 이동시 진행하는 덧셈(왼쪽, 오른쪽)은 인덱스를 이용하여 해결하였다.

  • height : 행 (1 ~ len(triangle)-1)
  • step : 열 (0 ~ height)
    ※ 열의 개수는 행의 개수와 같다.

step 1)
덧셈은 1행부터 triangle의 길이(n)-1 범위까지 진행한다.
※ 0번째 행은 변화가 없다.

step 2)
주어진 배열이 삼각형의 형태이므로 가장 왼쪽과 오른쪽은 한 번의 연산만 진행된다.

따라서, 다음과 같이 3가지로 구분하였다.

  1. 가장 왼쪽 열의 경우 : 이전 행의 첫번째 열 값을 누적한다.
  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])
profile
허브

0개의 댓글