알고리즘

[프로그래머스] 정수 삼각형 (파이썬)

유병각 2022. 2. 2. 16:01

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/43105

 

코딩테스트 연습 - 정수 삼각형

[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] 30

programmers.co.kr

 

문제풀이

삼각형의 경로를 지나면서 최대값을 가지는 경로를 구하는 문제이다.

삼각형 트리안에 들어가는 값들은 0보다 크거나 같은 정수이기 때문에, 맨 아랫줄 삼각형의 누적값들 중 최대값을 고르면 되는 문제이다.

 

Sum(i,j) = V(i,j) + max(Sum(i-1, j-1), Sum(i-1, j)) 라는 점화식을 이용해 풀면 되는데,

i, j 값이 오바되지 않도록 예외처리만 신경써주면 쉬운 문제이다. 

 

시간복잡도

n 층의 n 개의 원소들은 각각 비교를 2번 씩 진행하므로, 2 * n 의 계산을 진행하며

위와같은 연산을 하므로 결국 시간복잡도는 O(n^2) 이다.

 

소스코드

import copy;

def solution(triangle):
    value = copy.deepcopy(triangle);
    height = len(triangle);
    
    for i in range(1, height):
        for k in range(0, i + 1):
            if (k == 0):
                left = 0;
            else:
                left = value[i-1][k-1];
            
            if (k == i):
                right = 0;
            else:
                right = value[i-1][k];
            
            value[i][k] = triangle[i][k] + max(left, right);
    return max(value[height - 1]);