카테고리 없음

[프로그래머스 Lv.3] 정수 삼각형(DP)

이숨인 2024. 8. 23. 23:42

🍇문제

 

🍇풀이방법

삼각형 모양의 숫자 배열에서, 꼭대기에서부터 시작하여 아래로 내려오면서 숫자를 더해 나갈 때, 가장 큰 합을 찾는 문제이다. 각 위치에서는 그 위치까지 도달할 수 있는 두 가지 경로가 존재하며, 이전 단계에서 선택된 최적 경로의 값을 고려해야 한다.

 

<접근 방식> 

이 문제는 Dynamic Programming(동적 계획법)을 사용하여 해결할 수 있다. 각 위치에서 최적의 경로를 선택하여 문제를 해결해보자.

 

1. DP 테이블 초기화

dp = [] for lst in triangle: dp.append([0] * len(lst))

 

dp 리스트는 삼각형 모양의 구조를 가지며, 각 위치에서의 최댓값을 저장하는 데 사용된다.

dp[i][j]는 삼각형의 i번째 행, j번째 열에 위치한 값까지 도달하는 최댓값을 의미한다.

 

2. 초기값 설정

dp[0][0] = triangle[0][0]

 

삼각형의 맨 위에 있는 첫 번째 요소(꼭짓점)로 dp[0][0]을 초기화한다

 

3. 왼쪽 빗면과 오른쪽 빗면 처리

 

=> 각 행의 첫 번째와 마지막 요소 처리

 

for i in range(1, len(triangle)):
	dp[i][0] = triangle[i][0] + dp[i-1][0] 
    	dp[i][-1] = triangle[i][-1] + dp[i-1][-1]
 
삼각형의 각 행에서 첫 번째와 마지막 요소는 각각 자신의 바로 위에 있는 요소로부터만 영향을 받는다. 
 
 

4. 내부 요소 처리

for i in range(1, len(triangle)):
    for j in range(1, len(triangle[i]) - 1):
        dp[i][j] = triangle[i][j] + max(dp[i-1][j-1], dp[i-1][j])
 

삼각형의 내부 요소들은 자신이 위치한 자리까지 도달할 수 있는 두 가지 경로(왼쪽 위에서 내려오는 경우 & 오른쪽 위에서 내려오는 경우)를 고려해 최댓값을 선택한다.

 

5. 최종 결과 도출

answer = max(dp[-1]) return answer

 

 

마지막 행에서 가장 큰 값을 반환한다. 이 값이 꼭대기에서 삼각형의 바닥까지 내려오는 동안의 최대 합이 된다!

 

🍇코드

#각 위치에서는, max(내 왼쪽 위까지합 , 내 오른쪽 위까지 합)

def solution(triangle):
    
    dp = []
    for lst in triangle:
        dp.append([0] * len(lst)) #   [[0], [0, 0], [0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0]]
    dp[0][0] = triangle[0][0]
    #왼쪽 빗면,오른쪽 빗면은 한쪽 방향에서만 내려옴
    for i in range(1,len(triangle)): #   [[7], [10, 15], [18, 0, 15], [20, 0, 0, 19], [24, 0, 0, 0, 24]]
        dp[i][0]= triangle[i][0] + dp[i-1][0]
        dp[i][-1]= triangle[i][-1] + dp[i-1][-1]
    
    print(dp)
    for i in range(1,len(triangle)):
        for j in range(1, len(triangle[i]) - 1):
            dp[i][j] = triangle[i][j] + max(dp[i-1][j-1],dp[i-1][j])
            
    

    answer = max(dp[-1])
    return answer