๐Ÿงถ ์ดˆ๋ณด์ž์šฉ ๊ฐ€์ด๋“œ โ€˜Minimum ASCII Delete Sum for Two Stringsโ€™ โ€“ LeetCode 712 (C++, Python, JavaScript)

๋ฐœํ–‰: (2026๋…„ 1์›” 10์ผ ์˜คํ›„ 01:48 GMT+9)
7 min read
์›๋ฌธ: Dev.to

Source: Dev.to

๐Ÿงถ ์ดˆ๋ณด์ž ์นœํ™” ๊ฐ€์ด๋“œ '๋‘ ๋ฌธ์ž์—ด์˜ ์ตœ์†Œ ASCII ์‚ญ์ œ ํ•ฉ' โ€“ LeetCode 712 (C++, Python, JavaScript) ํ‘œ์ง€ ์ด๋ฏธ์ง€

Problem Summary

์ฃผ์–ด์ง„ ๊ฒƒ:

  • ๋‘ ๋ฌธ์ž์—ด s1์™€ s2.

๋ชฉํ‘œ:

  • ๋‘ ๋ฌธ์ž์—ด์„ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ญ์ œํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ž๋“ค์˜ ASCII ํ•ฉ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค.

Source: โ€ฆ

์ง๊ด€

์ด ๋ฌธ์ œ๋Š” ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„์ˆ˜์—ด (LCS) ํ˜น์€ ํŽธ์ง‘ ๊ฑฐ๋ฆฌ(Edit Distance) ๋ฌธ์ œ์˜ ๋ณ€ํ˜•์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ๊ฐ ๋ฌธ์ž ์Œ์— ๋Œ€ํ•ด ๋‘ ๋ฌธ์ž์—ด์„ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ์œ ์ง€ํ• ์ง€ ์‚ญ์ œํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(DP) ๊ณผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์„ ํƒ์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค:

  1. ๊ธฐ๋ณธ ๊ฒฝ์šฐ โ€“ ํ•œ ๋ฌธ์ž์—ด์˜ ๋์— ๋„๋‹ฌํ•˜๋ฉด, ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์— ๋‚จ์•„ ์žˆ๋Š” ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ๋งŒ์ด ๋‘ ๋ฌธ์ž์—ด์„ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‚จ์€ ๋ฌธ์ž๋“ค์˜ ASCII ๊ฐ’์„ ๋ชจ๋‘ ๋”ํ•œ ๊ฐ’์„ ๋น„์šฉ์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ผ์น˜ โ€“ s1[i]์™€ s2[j]๊ฐ€ ๋™์ผํ•˜๋ฉด, ์ด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋น„์šฉ์ด 0์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋‹ค์Œ ๋ฌธ์ž ์Œ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ถˆ์ผ์น˜ โ€“ ๋ฌธ์ž๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์„ ํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค:
    • s1[i]๋ฅผ ์‚ญ์ œํ•˜๊ณ (๊ทธ ASCII ๊ฐ’์„ ๋น„์šฉ์œผ๋กœ) ๋‚˜๋จธ์ง€ s1๊ณผ ํ˜„์žฌ s2๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
    • s2[j]๋ฅผ ์‚ญ์ œํ•˜๊ณ (๊ทธ ASCII ๊ฐ’์„ ๋น„์šฉ์œผ๋กœ) ํ˜„์žฌ s1๊ณผ ๋‚˜๋จธ์ง€ s2๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  4. ์ตœ์ ํ™” โ€“ ํ•ญ์ƒ ์ตœ์†Œ ํ•ฉ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ 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๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ€์ค‘โ€‘๋ฌธ์ž์—ด ๋ฌธ์ œ๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋ฉด ๊ฒ€์ƒ‰ ์—”์ง„์ด๋‚˜ ๋น„๊ต ๋„๊ตฌ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ํ›จ์”ฌ ๋” ํšจ๊ณผ์ ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

๐Ÿงฑ ์ดˆ๋ณด์ž์šฉ ๊ฐ€์ด๋“œ โ€˜๊ทธ๋ฆฌ๋“œ์—์„œ ์ •์‚ฌ๊ฐํ˜• ๊ตฌ๋ฉ์˜ ๋ฉด์  ์ตœ๋Œ€ํ™”โ€™ โ€“ LeetCode 2943 (C++, Python, JavaScript)

Problem Overview ๋‹น์‹ ์—๊ฒŒ ์ฃผ์–ด์ง„ ๊ฒƒ์€: - ๊ฒฉ์ž(grid) ๋‚ด์˜ ๋‚ด๋ถ€ ์ˆ˜ํ‰ ๋ฐ ์ˆ˜์ง ๋ง‰๋Œ€์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ n๊ณผ m. - ๋‘ ๋ฐฐ์—ด arrays, hBars์™€ vBars, listingโ€ฆ

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

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