Algorithm/문제풀이

[Leetcode] 343. Integer Break 문제풀이

bluespacedev 2021. 10. 2. 13:43

https://leetcode.com/problems/integer-break/

 

Integer Break - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

문제 내용

숫자 n이 주어질 때

숫자 n을 쪼개서 더할 수 있는 정수 배열을 만들고, 그 정수 배열의 모든 곱이 가장 큰 값 구하기

 

Example 1:

Input: n = 2

Output: 1

Explanation: 2 = 1 + 1 (정수 배열을 1,1로 쪼갠뒤) , 1 × 1 = 1. (해당 배열을 곱함)

 

문제 풀이

분할정복 개념을 적용할 수 있다.

n을 쪼갰을때 n 이랑 n-i 로 분할되는데 해당 최대값을 서로 곱하거나

n이랑 n-i이랑도 곱하는 경우의 수를 4개로 나눌수 있다.

 

분할 정복에서 발생한 중복되는 부분을 DP로 적용하면 된다.

 

class Solution {
public:
    int dp[59] = {0,};
    
    int integerBreak(int n) {
        if (n <= 2)
            return 1;
        
        if (dp[n])
            return dp[n];

        for (int i = 1; i <= n/2; ++i) {
            dp[n] = max(dp[n], i * (n-i));
            dp[n] = max(dp[n], i * integerBreak(n-i));
            dp[n] = max(dp[n], integerBreak(i) * (n-i));
            dp[n] = max(dp[n], integerBreak(i) * integerBreak(n-i));
        }
        
        return dp[n];
    }
};