๐งโโ๏ธ์ด๋ณด์์ฉ ๊ฐ์ด๋ 'Max Dot Product of Two Subsequences' โ LeetCode 1458 (C++, Python, JavaScript)
Source: Dev.to

๋ฌธ์ ์์ฝ
์ฃผ์ด์ง ๊ฒ:
- ์ ์ ๋ฐฐ์ด ๋ ๊ฐ,
nums1์nums2.
๋ชฉํ:
- ๋ ๋ฐฐ์ด์์ ๊ธธ์ด๊ฐ ๊ฐ์ ๋น์ด ์์ง ์์ ๋ถ๋ถ ์์ด๋ค ์ฌ์ด์ ์ต๋ ๋ด์ ์ ์ฐพ๋๋ค.
์ง๊ด
์ด ๋ฌธ์ ์ ํต์ฌ์ ๋์ ํ๋ก๊ทธ๋๋ฐ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ถ๋ถ์์ด์ ์ฐพ๊ณ ์๊ธฐ ๋๋ฌธ์, ๊ฐ ๋จ๊ณ์์ ํ์ฌ ์ซ์๋ค์ ๊ณฑ์ ํฌํจ์ํฌ์ง, ๋์ค์ ๋ ์ข์ ์์ ์ฐพ๊ธฐ ์ํด ๊ฑด๋๋ธ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ dp[i][j]๊ฐ ์ฒซ ๋ฒ์งธ ๋ฐฐ์ด์ ์ธ๋ฑ์ค i๊น์ง์ ๋ ๋ฒ์งธ ๋ฐฐ์ด์ ์ธ๋ฑ์ค j๊น์ง์ ์์๋ค์ ์ฌ์ฉํ์ฌ ์ป์ ์ ์๋ ์ต๋ ์ ๊ณฑ์ ๋ํ๋ด๋ 2์ฐจ์ ๊ฒฉ์๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
๊ฐ ์ธ๋ฑ์ค ์ (i, j)์ ๋ํด ์ธ ๊ฐ์ง ์ ํ์ด ์์ต๋๋ค:
- ์๋ก์ด ๊ณฑ์ ์์ํ๊ฑฐ๋ ์ด์ ๊ณฑ์ ํ์ฅ โ
A[i] * B[j]๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด์ ์ต์ ๊ฒฐ๊ณผdp[iโ1][jโ1]๊ฐ ์์๋ผ๋ฉด, ์ด๋ฅผ ํ์ฌ ๊ณฑ์ ๋ํฉ๋๋ค. - ์ฒซ ๋ฒ์งธ ๋ฐฐ์ด์ ํ์ฌ ์์๋ฅผ ๊ฑด๋๋ฐ๊ธฐ โ
dp[iโ1][j]๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ต๋๋ค. - ๋ ๋ฒ์งธ ๋ฐฐ์ด์ ํ์ฌ ์์๋ฅผ ๊ฑด๋๋ฐ๊ธฐ โ
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 ์์ด ๋น๊ต)์์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ํจํด์ ๋ง์คํฐํ๋ฉด ๋๊ท๋ชจ ๋ฐ์ดํฐ ๋งค์นญ์ ํฌํจํ๋ ๊ธฐ์ ๋ฉด์ ์์ ๊ฐ๋ ฅํ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.