μ½”λ”© ν…ŒμŠ€νŠΈ/μžλ°”

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

HHRR 2024. 7. 24. 16:00

 

문제

 

풀이

 

 

DP λ¬Έμ œλ‹€. νŠΈλ¦¬μ—μ„œ μžμ‹λ“€μ˜ λˆ„μ ν•©μ΄ μ΅œλŒ€κ°€λ˜λŠ” 값을 좜λ ₯ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

DP 점화식을 μ•„λž˜μ™€ 같이 μƒκ°ν–ˆλ‹€.

{μžμ‹μ˜ ν˜„μž¬ κ°’ + (μ˜€λŒ€κ°μ„ μœ„ or μ™ΌλŒ€κ°μ„ μœ„) 쀑 μ΅œλŒ“κ°’} 을 κ΅¬ν•΄μ„œ λ‹¨λ§λ…Έλ“œμ— λˆ„μ  합을 λ„£μ–΄λ†“λŠ”λ‹€

 

이 μ ν™”μ‹μœΌλ‘œ DP에 λˆ„μ ν•©μ„ λ„£μ–΄λ†“μœΌλ©΄ λ§ˆμ§€λ§‰ 배열에 총 λˆ„μ ν•©μ˜ κ²½μš°κ°€ μŒ“μ΄λ―€λ‘œ λ§ˆμ§€λ§‰ λ°°μ—΄ 쀑 μ΅œλŒ“κ°’μ„ 좜λ ₯ν•˜λ©΄ 닡이닀.

 

class Solution {
    public int solution(int[][] triangle) {
        int len = triangle.length;
        int[][] dp = new int[len][len];

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

        for (int i=1; i<len; i++){
            dp[i][0] = triangle[i][0] + dp[i-1][0]; // νŠΈλ¦¬μ—μ„œ μ™Όμͺ½μ€ 무쑰건 μ™Όμͺ½λΌλ¦¬μ˜ 합이 κ°€μž₯ 큼
            for (int j=1; j<i+1; j++){
                dp[i][j] += triangle[i][j] + Math.max(dp[i-1][j-1], dp[i-1][j]); // dp 점화식
            }
        }
        // dp[len-1] λ°°μ—΄(λ§ˆμ§€λ§‰ λ°°μ—΄)이 각 λˆ„μ ν•©μ„ λ”ν•œ λΆ€λΆ„μ΄λ―€λ‘œ μ—¬κΈ°μ„œ μ΅œλŒ“κ°’μ΄ μ •λ‹΅
        int ans = Arrays.stream(dp[len-1]).max().getAsInt();
        return ans;
    }
}

 

1. dp λ°°μ—΄μ˜ 루트λ₯Ό triangle λ°°μ—΄μ˜ λ£¨νŠΈμ™€ κ°™κ²Œ μ„€μ •ν•΄μ€€λ‹€.

2. νŠΈλ¦¬μ—μ„œ μ™Όμͺ½ 뢀뢄은 무쑰건 μ™Όμͺ½λΌλ¦¬μ˜ λˆ„μ ν•©μ΄ μ΅œλŒ€μ΄λ―€λ‘œ κ·Έ 뢀뢄을 λ¨Όμ € 계산해쀀닀.

3. μœ„μ—μ„œ μ„Έμš΄ 점화식을 μ½”λ“œλ‘œ 짜면 λ‹€μŒκ³Ό κ°™λ‹€.

DP[i][j] += triangle[i][j] + Math.max(dp[i-1][j-1], dp[j-1][j])

4. λ§ˆμ§€λ§‰μœΌλ‘œ stream을 μ΄μš©ν•΄μ„œ dp의 λ§ˆμ§€λ§‰ λ°°μ—΄μ˜ μ΅œλŒ“κ°’μ„ λ½‘μ•„μ™€μ„œ λ°˜ν™˜ν•˜λ„λ‘ κ΅¬ν˜„ν–ˆλ‹€.