Algorithm/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / Python] μ •μˆ˜ μ‚Όκ°ν˜•

meeeeejin 2021. 4. 6. 16:22

문제 링크: 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

 

문제 μ„€λͺ…

거쳐온 μˆ«μžλ“€μ˜ ν•©μ˜ μ΅œλŒ“κ°’μ„ μ €μž₯ν•˜λŠ” dp ν…Œμ΄λΈ”μ„ μƒμ„±ν•©λ‹ˆλ‹€. 

 

triangle[i][j]에 λ„λ‹¬ν•˜λŠ” 방법은 두 가지 방법이 μžˆμŠ΅λ‹ˆλ‹€. 

  1. triangle[i - 1][j - 1]μ—μ„œ triangle[i][j]둜 κ°€κΈ°
  2. triangle[i - 1][j]μ—μ„œ triangle[i][j]둜 κ°€κΈ°

dp[i][j]λŠ” μœ„ 두 가지 κ°’ μ€‘μ—μ„œ μ΅œλŒ“κ°’μ„ μ €μž₯ν•©λ‹ˆλ‹€. 

 

 

예λ₯Ό λ“€μ–΄ triangle 배열이 λ‹€μŒκ³Ό κ°™λ‹€λ©΄

7        
3 8      
8 1 0    
2 7 4 4  
4 5 2 6 5

dp ν…Œμ΄λΈ”μ€ λ‹€μŒκ³Ό 같이 κ³„μ‚°λ©λ‹ˆλ‹€. 

7        
10(7 + 3) 15(7 + 8)      
18(10 + 8) 16(15 + 1) 15(15 + 0)    
20(18 + 2) 25(18 + 7) 20(16 + 4) 19(15 + 4)  
24(20 + 4) 30(25 + 5) 27(25 + 2) 26(20 + 6) 24(19 + 5)

dp ν…Œμ΄λΈ” 계산이 λλ‚œ 후에 λ§ˆμ§€λ§‰ μ€„μ˜ μ›μ†Œ μ€‘μ—μ„œ μ΅œλŒ“κ°’μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€. 

 

 

 

μ†ŒμŠ€μ½”λ“œ

def solution(triangle):
    # dp ν…Œμ΄λΈ” μ΄ˆκΈ°ν™”
    dp = [[0] * len(triangle) for _ in range(len(triangle))]
    dp[0][0] = triangle[0][0]
    # 거쳐간 숫자의 μ΅œλŒ“κ°’ κ΅¬ν•˜κΈ°
    for i in range(0, len(triangle) - 1):
        for j in range(len(triangle[i])):
            dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + triangle[i + 1][j])
            dp[i + 1][j + 1] = max(dp[i + 1][j + 1], dp[i][j] + triangle[i + 1][j + 1])

    return max(dp[-1]) # dp ν…Œμ΄λΈ”μ˜ λ§ˆμ§€λ§‰ μ›μ†Œλ“€ 쀑 μ΅œλŒ“κ°’ λ°˜ν™˜

 

 

 

 

 

728x90