๐Ÿง—โ€โ™‚๏ธ์ดˆ๋ณด์ž์šฉ ๊ฐ€์ด๋“œ 'Max Dot Product of Two Subsequences' โ€“ LeetCode 1458 (C++, Python, JavaScript)

๋ฐœํ–‰: (2026๋…„ 1์›” 8์ผ ์˜คํ›„ 04:20 GMT+9)
5 ๋ถ„ ์†Œ์š”
์›๋ฌธ: 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

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

๐ŸŒ ์ดˆ๋ณด์ž ์นœํ™” ๊ฐ€์ด๋“œ โ€˜๊ฐ€์žฅ ๊นŠ์€ ๋…ธ๋“œ๋“ค์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ์„œ๋ธŒํŠธ๋ฆฌโ€™ โ€“ LeetCode 865 (C++, Python, JavaScript)

!ํ‘œ์ง€ ์ด๋ฏธ์ง€: ๐ŸŒ ์ดˆ๋ณด์ž ์นœํ™” ๊ฐ€์ด๋“œ โ€˜Smallest Subtree with all the Deepest Nodesโ€™ โ€“ LeetCode 865 C++, Python, JavaScript https://media2.dev.to/dynamic/ima

์ˆ˜ํ•™ ๊ต์‚ฌ์—์„œ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค & ์›น ๊ฐœ๋ฐœ๊นŒ์ง€: ๋‚˜์˜ ์ฝ”๋”ฉ ์—ฌ์ •#introduction #learning #webdev #python #datascience

๋‚ด ๋ฐฐ๊ฒฝ ์•ˆ๋…•ํ•˜์„ธ์š” DEV ์ปค๋ฎค๋‹ˆํ‹ฐ ๐Ÿ‘‹ ์ €๋Š” ์ˆ˜ํ•™ ๊ต์‚ฌ์ธ Ahmed Anter์ด๋ฉฐ, ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์‚ฌ๋ž‘ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ์ €์˜ ์—ฌ์ •์€ ๊ต์‹ค์—์„œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค...