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

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

Source: Dev.to

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

๋ฌธ์ œ ์š”์•ฝ

์ฃผ์–ด์ง€๋Š” ๊ฒƒ:

  • root ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ.
  • ๋‹ค์–‘ํ•œ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค ์ค‘, โ€œ๊ฐ€์žฅ ๊นŠ์€โ€ ๋…ธ๋“œ๋Š” ๋ฃจํŠธ์—์„œ ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๋…ธ๋“œ์ด๋‹ค.

๋ชฉํ‘œ:

  • ๊ทธ ๊ฐ€์žฅ ๊นŠ์€ ๋…ธ๋“œ๋“ค์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์ฐพ๋Š”๋‹ค. ๊ฐ€์žฅ ๊นŠ์€ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋ฟ์ด๋ผ๋ฉด ๊ทธ ๋…ธ๋“œ ์ž์ฒด๊ฐ€ ๋‹ต์ด๋‹ค.

์ง๊ด€

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋‘ ๊ฐ€์ง€๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค: ์ž์†๋“ค์˜ ๊นŠ์ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊นŠ์€๊ฐ€? ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์˜ ๊ณตํ†ต ์กฐ์ƒ์ด ์–ด๋–ค ๋…ธ๋“œ์ธ๊ฐ€?

์žฌ๊ท€์ ์ธ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹ , ํ•จ์ˆ˜๋Š” ํ•œ ์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: ํ•ด๋‹น ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ๋„๋‹ฌํ•œ ๊ฐ€์žฅ ๊นŠ์€ ๋ ˆ๋ฒจ๊ณผ ์ตœ์†Œ ๊ณตํ†ต ์กฐ์ƒ (LCA)์˜ ํ›„๋ณด ๋…ธ๋“œ.

  • ๊ธฐ๋ณธ ๊ฒฝ์šฐ: ๋…ธ๋“œ๊ฐ€ null์ด๋ฉด ๊นŠ์ด๋Š” 0์ด๊ณ  LCA๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์žฌ๊ท€ ๋‹จ๊ณ„: ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ž์‹์˜ ์ตœ๋Œ€ ๊นŠ์ด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
    • ์™ผ์ชฝ์ด ๋” ๊นŠ์œผ๋ฉด, ๊ฐ€์žฅ ๊นŠ์€ ๋…ธ๋“œ๋“ค์€ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ์•ˆ์—๋งŒ ์กด์žฌํ•˜๋ฏ€๋กœ ์™ผ์ชฝ ๊ฒฐ๊ณผ๋ฅผ ์œ„๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ค๋ฅธ์ชฝ์ด ๋” ๊นŠ์œผ๋ฉด, ๊ฐ€์žฅ ๊นŠ์€ ๋…ธ๋“œ๋“ค์€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ์•ˆ์—๋งŒ ์กด์žฌํ•˜๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ ๊ฒฐ๊ณผ๋ฅผ ์œ„๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    • ๊นŠ์ด๊ฐ€ ๊ฐ™์œผ๋ฉด, ๊ฐ€์žฅ ๊นŠ์€ ๋…ธ๋“œ๋“ค์ด ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๊ฐ€์ง€์— ๋‚˜๋‰˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ์„œ๋ธŒํŠธ๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ๋ธ”๋ก

C++

struct Result {
    TreeNode* lca;
    int depth;
};

class Solution {
public:
    TreeNode* subtreeWithAllDeepest(TreeNode* root) {
        return dfs(root).lca;
    }

private:
    Result dfs(TreeNode* root) {
        if (root == nullptr) return {nullptr, 0};

        Result left = dfs(root->left);
        Result right = dfs(root->right);

        // If one side is deeper, the deepest nodes are exclusively there
        if (left.depth > right.depth) {
            return {left.lca, left.depth + 1};
        }
        if (left.depth  // truncated line from original source

Python

class Solution:
    def subtreeWithAllDeepest(self, root):
        def dfs(node):
            if not node:
                return None, 0

            left_lca, left_depth = dfs(node.left)
            right_lca, right_depth = dfs(node.right)

            if left_depth > right_depth:
                return left_lca, left_depth + 1
            if right_depth > left_depth:
                return right_lca, right_depth + 1

            # If depths are equal, current node is the LCA
            return node, left_depth + 1

        return dfs(root)[0]

JavaScript

var subtreeWithAllDeepest = function(root) {
    const dfs = (node) => {
        if (!node) return { lca: null, depth: 0 };

        const left = dfs(node.left);
        const right = dfs(node.right);

        if (left.depth > right.depth) {
            return { lca: left.lca, depth: left.depth + 1 };
        }
        if (right.depth > left.depth) {
            return { lca: right.lca, depth: right.depth + 1 };
        }

        // If depths are equal, this node is the common ancestor
        return { lca: node, depth: left.depth + 1 };
    };

    return dfs(root).lca;
};

ํ•ต์‹ฌ ์š”์ 

  • Postโ€‘order Traversal: ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ถ€๋ชจ๋ณด๋‹ค ๋จผ์ € ์ฒ˜๋ฆฌํ•˜์—ฌ ์ „์ฒด ์„œ๋ธŒํŠธ๋ฆฌ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Multiple Return Values: ๋…ธ๋“œ์™€ ๊นŠ์ด ๋‘ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ ์ค‘๋ณต๋œ ํƒ์ƒ‰์„ ํ”ผํ•˜๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํšจ์œจ์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • LCA Logic: ์ด ๋ฌธ์ œ๋Š” ๊ณ ์ „์ ์ธ ์ตœ์†Œ ๊ณตํ†ต ์กฐ์ƒ(LCA) ๋ฌธ์ œ์˜ ๋ณ€ํ˜•์œผ๋กœ, โ€œ๋Œ€์ƒโ€์ด ํŠน์ • ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๊นŠ์ด์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

์ตœ์ข… ์ƒ๊ฐ

์ด ๋ฌธ์ œ๋Š” ์žฌ๊ท€์™€ ๋ณต์žกํ•œ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๋‹ค๋ฃจ๋Š” ๋Šฅ๋ ฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์ˆ  ๋ฉด์ ‘์—์„œ ์ธ๊ธฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ๋…ผ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณ„์ธต ๊ตฌ์กฐ์—์„œ โ€œ๊ฐ€์žฅ ๊ตฌ์ฒด์ ์ธ ๊ณตํ†ต ์นดํ…Œ๊ณ ๋ฆฌโ€๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ์˜์กด์„ฑ ํŠธ๋ฆฌ์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ณต์œ  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์ธตํ˜• ๋ฐ์ดํ„ฐ์™€ ์ž‘์—…ํ•˜๋Š” ๋ชจ๋“  ์—”์ง€๋‹ˆ์–ด์—๊ฒŒ ์ด ํ•˜ํ–ฅ์‹ ์ •๋ณด ํ๋ฆ„์„ ๋งˆ์Šคํ„ฐํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

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

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