자격증 & 문제풀이/프로그래머스 코딩 문제 풀이

[python 파이썬][프로그래머스] 정수 삼각형 (동적계획법)

YSY^ 2020. 6. 12. 15:13

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

문제 설명

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

 

◆ 문제풀이

  • 비어있는 리스트 memo를 만들어 하나씩 저장한다.(Memorial)
  • 아래사진과 같이 다섯번째줄의 세번째 숫자 '2' (triangle[4][2])로 경로가 오는 경우는 네번째줄의 두번째숫자 '7'(triangle[3][1])과 세번째숫자 '4' (triangle[3][2])이다.
  • 즉, triangle[i][j]로 오는 경우는 triangle[i-1][j-1], triangle[i-1][j] 둘 중에 하나이다.

  • memo[i][j]가 왼쪽끝에 있는 경우(j=0)는 memo[i-1][j]에서만 올수 있으며, 오른쪽 끝에있는 경우(j가 가장 마지막)는 memo[i-1][j-1]에서만 올 수 있다.

◆ 코드풀이

def solution(triangle):
    memo=[[0 for _ in range(j)] for j in range(1,len(triangle)+1)]
    memo[0][0] = triangle[0][0]
    memo[1][0] = memo[0][0] + triangle[1][0]
    memo[1][1] = memo[0][0] + triangle[1][1]
    for i in range(2,len(triangle)):
        for j in range(0,i+1):
            if j ==0: #memo[i][j]가 가장 왼쪽에 있는 경우
                memo[i][j] = memo[i-1][j] + triangle[i][j]
            elif j == i: #memo[i][j]가 가장 오른쪽에 있는 경우
                memo[i][j] = memo[i-1][j-1] + triangle[i][j]
            else:
                memo[i][j]= max(memo[i-1][j-1], memo[i-1][j]) + triangle[i][j]
    return max(memo[-1])
728x90
반응형