220111 - 정수 삼각형

이상해씨·2022년 1월 11일
0

알고리즘 풀이

목록 보기
37/94

◾ 정수 삼각형 : 프로그래머스 LEVEL 3

문제


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

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


입력

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

출력

  • 거쳐간 숫자의 최대값

입출력 예

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

◾ 풀이

1. 해설

  • 동적 계획법을 사용하여 해결할 수 있다.
  • 대각선 방향으로만 움직일 수 있기 때문에 각 위치로 갈 수 있는 경우는 2가지이다.
  • 최하단에서 한 칸씩 올라가며 최대값을 갱신해나간다.
    • 가장 상단의 값이 최대값이 된다.

2. 프로그램

  1. 계산을 진행하기 위해 dp 생성
    • 쉬운 계산을 위해 원래 크기보다 +1크게 생성
  2. 최하단 행부터 최대값 갱신하며 진행
  3. 최상단 행의 값이 최대값이므로 반환
# 코드
def solution(triangle):
    answer = 0
    triangle_size = len(triangle)   # 삼각형의 높이(레벨) 확인
    # 레벨 +1의 크기로 행렬 생성
    # 쉽게 계산하기 위해 원래 크기보다 +1 크게 생성
    dp = [[0] * (triangle_size+1) for _ in range(triangle_size+1)]

    # 최하단 레벨부터 최대값을 갱신하며 진행
    # i : 행 인덱스 + 1, 열의 개수
    # j : 열 인덱스
    for i in range(triangle_size, 0, -1):
        for j in range(i):
            # 현재 인덱스에서의 최대값
            # (바로 아래, 오른쪽 대각 아래의 값) 중 최대값 + 현재 위치 값
            dp[i-1][j] = max(dp[i][j], dp[i][j+1]) + triangle[i-1][j]

    # 최상단의 경우가 최대값
    answer = dp[0][0]

    return answer

profile
후라이드 치킨

0개의 댓글

관련 채용 정보