๐งถ ์ด๋ณด์์ฉ ๊ฐ์ด๋ โMinimum ASCII Delete Sum for Two Stringsโ โ LeetCode 712 (C++, Python, JavaScript)
Source: Dev.to

Problem Summary
์ฃผ์ด์ง ๊ฒ:
- ๋ ๋ฌธ์์ด
s1์s2.
๋ชฉํ:
- ๋ ๋ฌธ์์ด์ ๋์ผํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ์ญ์ ํด์ผ ํ๋ ๋ฌธ์๋ค์ ASCII ํฉ์ ์ต์ํํ๋ค.
Source: โฆ
์ง๊ด
์ด ๋ฌธ์ ๋ ์ต์ฅ ๊ณตํต ๋ถ๋ถ์์ด (LCS) ํน์ ํธ์ง ๊ฑฐ๋ฆฌ(Edit Distance) ๋ฌธ์ ์ ๋ณํ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค. ํต์ฌ ์์ด๋์ด๋ ๊ฐ ๋ฌธ์ ์์ ๋ํด ๋ ๋ฌธ์์ด์ ๋์ผํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ํด๋น ๋ฌธ์๋ฅผ ์ ์งํ ์ง ์ญ์ ํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ๋์ ํ๋ก๊ทธ๋๋ฐ(DP) ๊ณผ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ ํ์ ํ์ํฉ๋๋ค:
- ๊ธฐ๋ณธ ๊ฒฝ์ฐ โ ํ ๋ฌธ์์ด์ ๋์ ๋๋ฌํ๋ฉด, ๋ค๋ฅธ ๋ฌธ์์ด์ ๋จ์ ์๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ญ์ ํ๋ ๊ฒ๋ง์ด ๋ ๋ฌธ์์ด์ ๋์ผํ๊ฒ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋จ์ ๋ฌธ์๋ค์ ASCII ๊ฐ์ ๋ชจ๋ ๋ํ ๊ฐ์ ๋น์ฉ์ผ๋ก ๋ฐํํฉ๋๋ค.
- ์ผ์น โ
s1[i]์s2[j]๊ฐ ๋์ผํ๋ฉด, ์ด๋ฅผ ์ ์งํ๋ ๋ฐ ๋น์ฉ์ด0์ ๋๋ค. ๋จ์ํ ๋ค์ ๋ฌธ์ ์์ผ๋ก ์ด๋ํฉ๋๋ค. - ๋ถ์ผ์น โ ๋ฌธ์๊ฐ ์ผ์นํ์ง ์์ ๊ฒฝ์ฐ, ๋ ๊ฐ์ง ์ฃผ์ ์ ํ์ด ์์ต๋๋ค:
s1[i]๋ฅผ ์ญ์ ํ๊ณ (๊ทธ ASCII ๊ฐ์ ๋น์ฉ์ผ๋ก) ๋๋จธ์งs1๊ณผ ํ์ฌs2๋ฅผ ๋น๊ตํฉ๋๋ค.s2[j]๋ฅผ ์ญ์ ํ๊ณ (๊ทธ ASCII ๊ฐ์ ๋น์ฉ์ผ๋ก) ํ์ฌs1๊ณผ ๋๋จธ์งs2๋ฅผ ๋น๊ตํฉ๋๋ค.
- ์ต์ ํ โ ํญ์ ์ต์ ํฉ์ ์ ๊ณตํ๋ ๊ฒฝ๋ก๋ฅผ ์ ํํฉ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ 2โ์ฐจ์ ๋ฐฐ์ด(
dp)์ ์ ์ฅํจ์ผ๋ก์จ ๋์ผํ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ค์ ๊ณ์ฐํ๋ ๊ฒ์ ํผํฉ๋๋ค.
์ฝ๋ ๋ธ๋ก
C++ ์๋ฃจ์
class Solution {
public:
int helper(string& s1, string& s2, int i, int j, vector>& dp) {
int n = s1.size();
int m = s2.size();
// If s1 is exhausted, delete remaining characters of s2
if (i == n) {
int sum = 0;
for (int k = j; k > dp(n, vector(m, -1));
return helper(s1, s2, 0, 0, dp);
}
};
ํ์ด์ฌ ์๋ฃจ์
class Solution:
def minimumDeleteSum(self, s1: str, s2: str) -> int:
n, m = len(s1), len(s2)
dp = [[-1] * m for _ in range(n)]
def helper(i, j):
# Base case: s1 exhausted
if i == n:
return sum(ord(c) for c in s2[j:])
# Base case: s2 exhausted
if j == m:
return sum(ord(c) for c in s1[i:])
if dp[i][j] != -1:
return dp[i][j]
if s1[i] == s2[j]:
dp[i][j] = helper(i + 1, j + 1)
else:
# Compare cost of deleting from s1 vs deleting from s2
delete_s1 = ord(s1[i]) + helper(i + 1, j)
delete_s2 = ord(s2[j]) + helper(i, j + 1)
dp[i][j] = min(delete_s1, delete_s2)
return dp[i][j]
return helper(0, 0)
์๋ฐ์คํฌ๋ฆฝํธ ์๋ฃจ์
/**
* @param {string} s1
* @param {string} s2
* @return {number}
*/
var minimumDeleteSum = function (s1, s2) {
const n = s1.length;
const m = s2.length;
const dp = Array.from({ length: n }, () => Array(m).fill(-1));
function helper(i, j) {
// Base case: s1 exhausted
if (i === n) {
let sum = 0;
for (let k = j; k < m; ++k) sum += s2.charCodeAt(k);
return sum;
}
// Base case: s2 exhausted
if (j === m) {
let sum = 0;
for (let k = i; k < n; ++k) sum += s1.charCodeAt(k);
return sum;
}
if (dp[i][j] !== -1) return dp[i][j];
if (s1[i] === s2[j]) {
dp[i][j] = helper(i + 1, j + 1);
} else {
// Minimum of deleting s1[i] or s2[j]
const deleteS1 = s1.charCodeAt(i) + helper(i + 1, j);
const deleteS2 = s2.charCodeAt(j) + helper(i, j + 1);
dp[i][j] = Math.min(deleteS1, deleteS2);
}
return dp[i][j];
}
return helper(0, 0);
};
Key Takeaways
- Memoization: 2โD ๋ฐฐ์ด์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํจ์ผ๋ก์จ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ง์ํ์์ O(nโฏยทโฏm) ์ผ๋ก ์ค์ธ๋ค, ์ฌ๊ธฐ์
n๊ณผm์ ๋ ๋ฌธ์์ด์ ๊ธธ์ด์ด๋ค. - ASCII Mapping: ๋ฌธ์ ๊ฐ์ ๋จ์ํ ๋ ์ด๋ธ์ด ์๋๋ค. Python์
ord()๋ JavaScript์charCodeAt()์ ์ฌ์ฉํ๋ฉด ํ ์คํธ๋ฅผ ์ต์ ํ๋ฅผ ์ํ ์์น ๋ฐ์ดํฐ๋ก ๋ค๋ฃฐ ์ ์๋ค. - Decision Trees: ์ด ๋ฌธ์ ๋ ์ ํ(
s1์ญ์ vs.s2์ญ์ )์ ์ฌ๊ท ํธ์ถ ํธ๋ฆฌ๋ก ๋ชจ๋ธ๋งํ๊ณ DP๋ก ํจ์จ์ ์ผ๋ก ๊ฐ์ง์น๊ธฐํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋ฅด์ณ์ค๋ค.
์ต์ข ์๊ฐ
Minimum ASCII Delete Sum ๋ฌธ์ ๋ ๊ฒ๋ณด๊ธฐ์ ๋จ์ํ ๋ฌธ์์ดโ์กฐ์ ์์ ์ ๋์ โํ๋ก๊ทธ๋๋ฐ ๊ณผ์ ๋ก ๋ฐ๊พธ๋ ์ ํ์ ์ธ ์์์ ๋๋ค. ๊ธฐ๋ณธ์ด ๋๋ LCSโ์คํ์ผ ์ฌ๊ท ๊ด๊ณ๋ฅผ ์ดํดํ๊ณ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ ์ฉํ๋ฉด ์ด๋ค ์ธ์ด์์๋ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
ํ์ค ์๊ณ ๋ฆฌ์ฆ์ ์ฝ๊ฐ์ ์์ ์ ๊ฐํ๋ฉด ์ ์ฉ ๋ถ์ผ๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ค์ โ์ธ๊ณ ์ํํธ์จ์ด ์์ง๋์ด๋ง์์๋ ์ด ๋
ผ๋ฆฌ๊ฐ Bioinformatics(์๋ฌผ์ ๋ณดํ)์์ DNA ์์ด์ ์ ๋ ฌํ๊ฑฐ๋ Version Control Systems(์: Git)์์ ๋ ํ์ผ ๋ฒ์ ๊ฐ์ diff๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ๊ฐ์คโ๋ฌธ์์ด ๋ฌธ์ ๋ฅผ ๋ง์คํฐํ๋ฉด ๊ฒ์ ์์ง์ด๋ ๋น๊ต ๋๊ตฌ๋ฅผ ๊ตฌ์ถํ ๋ ํจ์ฌ ๋ ํจ๊ณผ์ ์ผ๋ก ์์
ํ ์ ์์ต๋๋ค.