πŸ§—β€β™‚οΈμ΄ˆλ³΄μžμš© κ°€μ΄λ“œ 'Max Dot Product of Two Subsequences' – LeetCode 1458 (C++, Python, JavaScript)

λ°œν–‰: (2026λ…„ 1μ›” 8일 μ˜€ν›„ 04:20 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

πŸ§—β€β™‚οΈμ΄ˆλ³΄μž μΉœν™” κ°€μ΄λ“œ β€˜λ‘ λΆ€λΆ„ μˆ˜μ—΄μ˜ μ΅œλŒ€ 내적’ – LeetCode 1458

문제 μš”μ•½

μ£Όμ–΄μ§„ 것:

  • μ •μˆ˜ λ°°μ—΄ 두 개, nums1와 nums2.

λͺ©ν‘œ:

  • 두 λ°°μ—΄μ—μ„œ 길이가 같은 λΉ„μ–΄ μžˆμ§€ μ•Šμ€ λΆ€λΆ„ μˆ˜μ—΄λ“€ μ‚¬μ΄μ˜ μ΅œλŒ€ 내적을 μ°ΎλŠ”λ‹€.

직관

이 문제의 핡심은 동적 ν”„λ‘œκ·Έλž˜λ°μ— μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” λΆ€λΆ„μˆ˜μ—΄μ„ μ°Ύκ³  있기 λ•Œλ¬Έμ—, 각 λ‹¨κ³„μ—μ„œ ν˜„μž¬ μˆ«μžλ“€μ˜ 곱을 ν¬ν•¨μ‹œν‚¬μ§€, λ‚˜μ€‘μ— 더 쒋은 μŒμ„ μ°ΎκΈ° μœ„ν•΄ κ±΄λ„ˆλ›Έμ§€λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.

μš°λ¦¬λŠ” dp[i][j]κ°€ 첫 번째 λ°°μ—΄μ˜ 인덱슀 iκΉŒμ§€μ™€ 두 번째 λ°°μ—΄μ˜ 인덱슀 jκΉŒμ§€μ˜ μš”μ†Œλ“€μ„ μ‚¬μš©ν•˜μ—¬ 얻을 수 μžˆλŠ” μ΅œλŒ€ 점곱을 λ‚˜νƒ€λ‚΄λŠ” 2차원 격자λ₯Ό κ΅¬μΆ•ν•©λ‹ˆλ‹€.

각 인덱슀 쌍 (i, j)에 λŒ€ν•΄ μ„Έ κ°€μ§€ 선택이 μžˆμŠ΅λ‹ˆλ‹€:

  1. μƒˆλ‘œμš΄ 곱을 μ‹œμž‘ν•˜κ±°λ‚˜ 이전 곱을 ν™•μž₯ – A[i] * B[j]λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€. 이전 졜적 κ²°κ³Ό dp[i‑1][j‑1]κ°€ μ–‘μˆ˜λΌλ©΄, 이λ₯Ό ν˜„μž¬ 곱에 λ”ν•©λ‹ˆλ‹€.
  2. 첫 번째 λ°°μ—΄μ˜ ν˜„μž¬ μš”μ†Œλ₯Ό κ±΄λ„ˆλ›°κΈ° – dp[i‑1][j]λ₯Ό κ·ΈλŒ€λ‘œ κ°€μ Έμ˜΅λ‹ˆλ‹€.
  3. 두 번째 λ°°μ—΄μ˜ ν˜„μž¬ μš”μ†Œλ₯Ό κ±΄λ„ˆλ›°κΈ° – dp[i][j‑1]λ₯Ό κ·ΈλŒ€λ‘œ κ°€μ Έμ˜΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μ˜΅μ…˜λ“€μ„ κ³ λ €ν•¨μœΌλ‘œμ¨ κ²©μžλŠ” 점차 μ΅œλŒ€ κ°€λŠ₯ν•œ κ°’λ“€λ‘œ μ±„μ›Œμ§€κ³ , μ΅œμ’… 닡은 였λ₯Έμͺ½ μ•„λž˜ 셀에 μœ„μΉ˜ν•˜κ²Œ λ©λ‹ˆλ‹€.

μ½”λ“œ 블둝

C++

class Solution {
public:
    int maxDotProduct(vector& A, vector& B) {
        int n = A.size(), m = B.size();
        vector> dp(n, vector(m));

        for (int i = 0; i  0 && j > 0) {
                    dp[i][j] += max(dp[i - 1][j - 1], 0);
                }

                // Choice 2: Skip current element from A
                if (i > 0) {
                    dp[i][j] = max(dp[i][j], dp[i - 1][j]);
                }

                // Choice 3: Skip current element from B
                if (j > 0) {
                    dp[i][j] = max(dp[i][j], dp[i][j - 1]);
                }
            }
        }
        return dp[n - 1][m - 1];
    }
};

파이썬

class Solution:
    def maxDotProduct(self, A: List[int], B: List[int]) -> int:
        n, m = len(A), len(B)
        dp = [[0] * m for _ in range(n)]

        for i in range(n):
            for j in range(m):
                current_product = A[i] * B[j]

                if i > 0 and j > 0:
                    dp[i][j] = current_product + max(dp[i - 1][j - 1], 0)
                else:
                    dp[i][j] = current_product

                if i > 0:
                    dp[i][j] = max(dp[i][j], dp[i - 1][j])
                if j > 0:
                    dp[i][j] = max(dp[i][j], dp[i][j - 1])

        return dp[n - 1][m - 1]

μžλ°”μŠ€ν¬λ¦½νŠΈ

/**
 * @param {number[]} A
 * @param {number[]} B
 * @return {number}
 */
var maxDotProduct = function (A, B) {
    const n = A.length;
    const m = B.length;
    const dp = Array.from({ length: n }, () => Array(m).fill(0));

    for (let i = 0; i  0 && j > 0) {
                dp[i][j] = currentProduct + Math.max(dp[i - 1][j - 1], 0);
            } else {
                dp[i][j] = currentProduct;
            }

            if (i > 0) {
                dp[i][j] = Math.max(dp[i][j], dp[i - 1][j]);
            }
            if (j > 0) {
                dp[i][j] = Math.max(dp[i][j], dp[i][j - 1]);
            }
        }
    }

    return dp[n - 1][m - 1];
};

핡심 μš”μ 

  • Subsequence vs. Subarray: λΆ€λΆ„μˆ˜μ—΄μ˜ μ›μ†ŒλŠ” 연속될 ν•„μš”κ°€ μ—†μœΌλ©°, κ·Έλž˜μ„œ dp[i‑1][j]와 dp[i][j‑1]λ₯Ό μ‚¬μš©ν•΄ μš”μ†Œλ₯Ό β€œκ±΄λ„ˆλ›Έβ€ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • Dynamic Programming Power: 쀑간 κ²°κ³Όλ₯Ό ν…Œμ΄λΈ”μ— μ €μž₯ν•¨μœΌλ‘œμ¨ μ§€μˆ˜ μ‹œκ°„ 문제λ₯Ό 관리 κ°€λŠ₯ν•œ 이차 μ‹œκ°„ 문제둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
  • Handling Negative Numbers: 식 max(dp[i‑1][j‑1], 0)은 이전 λΆ€λΆ„μˆ˜μ—΄μ΄ ν˜„μž¬ 곱을 ν–₯μƒμ‹œν‚€λŠ”μ§€, μ•„λ‹ˆλ©΄ μƒˆλ‘œ μ‹œμž‘ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.

μ΅œμ’… 생각

이 λ¬Έμ œλŠ” 동적 ν”„λ‘œκ·Έλž˜λ°μ΄ 큰 탐색 곡간을 효율적으둜 탐색할 수 μžˆμŒμ„ λ³΄μ—¬μ€λ‹ˆλ‹€. μœ μ‚¬ν•œ 기법은 μΆ”μ²œ μ‹œμŠ€ν…œ(μ‚¬μš©μž 관심사λ₯Ό μ œν’ˆ νƒœκ·Έμ™€ λ§€μΉ­)κ³Ό 생물정보학(DNA μ„œμ—΄ 비ꡐ)μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€. 이 νŒ¨ν„΄μ„ λ§ˆμŠ€ν„°ν•˜λ©΄ λŒ€κ·œλͺ¨ 데이터 맀칭을 ν¬ν•¨ν•˜λŠ” 기술 λ©΄μ ‘μ—μ„œ κ°•λ ₯ν•œ 이점을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

Back to Blog

κ΄€λ ¨ κΈ€

더 보기 Β»