๐ŸŒฒ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ๊ฐ€์ด๋“œ 'Maximum Level Sum of a Binary Tree' โ€“ LeetCode 1161 (C++, Python, JavaScript)

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

Iโ€™m happy to translate the article for you, but Iโ€™ll need the actual text youโ€™d like translated. Could you please paste the content (excluding the source line you already provided) here? Once I have the text, Iโ€™ll keep the source link unchanged and translate the rest into Korean while preserving the original formatting and markdown.

๋ฌธ์ œ ์š”์•ฝ

์ด์ง„ ํŠธ๋ฆฌ์˜ root๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ๋Š” ์ •์ˆ˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฃจํŠธ๋Š” ๋ ˆ๋ฒจโ€ฏ1, ๊ทธ ์ž์‹๋“ค์€ ๋ ˆ๋ฒจโ€ฏ2, ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ ˆ๋ฒจ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ชฉํ‘œ:
๋…ธ๋“œ ๊ฐ’๋“ค์˜ ํ•ฉ์ด ์ตœ๋Œ€์ธ ๋ ˆ๋ฒจ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ ๋ ˆ๋ฒจ์ด ๋™์ผํ•œ ์ตœ๋Œ€ ํ•ฉ์„ ๊ฐ€์งˆ ๊ฒฝ์šฐ, ๊ฐ€์žฅ ์ž‘์€(์ฆ‰, ๊ฐ€์žฅ ๋†’์€) ๋ ˆ๋ฒจ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ

Example tree

Input:  root = [1,7,0,7,-8,null,null]
Output: 2
Explanation:
Level 1 sum = 1
Level 2 sum = 7 + 0 = 7
Level 3 sum = 7 + (-8) = -1
โ†’ The maximum sum is 7, occurring at level 2.

์„ค๋ช…:
๋ ˆ๋ฒจโ€ฏ1์˜ ํ•ฉ์€ 1, ๋ ˆ๋ฒจโ€ฏ2์˜ ํ•ฉ์€ 7โ€ฏ+โ€ฏ0โ€ฏ=โ€ฏ7, ๋ ˆ๋ฒจโ€ฏ3์˜ ํ•ฉ์€ 7โ€ฏ+โ€ฏ(-8)โ€ฏ=โ€ฏ-1์ž…๋‹ˆ๋‹ค.
โ†’ ์ตœ๋Œ€ ํ•ฉ์€ 7์ด๋ฉฐ, ์ด๋Š” ๋ ˆ๋ฒจโ€ฏ2์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ง๊ด€

ํŠธ๋ฆฌ๋ฅผ ๋ ˆ๋ฒจ๋ณ„๋กœ ์‚ดํŽด๋ณด๋Š” ๊ฐ€์žฅ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฉ๋ฒ•์€ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS) ์ž…๋‹ˆ๋‹ค.
ํ•˜๋‚˜์˜ ๊ฐ€์ง€๋ฅผ ๊นŠ๊ฒŒ ํŒŒ๊ณ ๋“ค๊ธฐ๋ณด๋‹ค๋Š”, BFS๋Š” ํ๋ฅผ ์‚ฌ์šฉํ•ด ํ˜„์žฌ โ€œ์ธตโ€์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋’ค ๋‹ค์Œ ์ธต์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ์š”

  1. ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ํ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  2. ํ๊ฐ€ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋™์•ˆ:
    • ํ˜„์žฌ ํ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ก โ†’ ์ด ๋ ˆ๋ฒจ์— ์žˆ๋Š” ๋…ธ๋“œ ์ˆ˜.
    • ๊ฐ ๋…ธ๋“œ๋ฅผ dequeueํ•˜๊ณ , ๊ทธ ๊ฐ’์„ levelSum์— ๋ˆ„์ ํ•œ ๋’ค, null์ด ์•„๋‹Œ ์ž์‹๋“ค์„ enqueueํ•ฉ๋‹ˆ๋‹ค.
    • ๋ ˆ๋ฒจ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด levelSum์„ ์ง€๊ธˆ๊นŒ์ง€ ๋ณธ ์ตœ๋Œ“๊ฐ’๊ณผ ๋น„๊ตํ•˜๊ณ , ํ•„์š”ํ•˜๋ฉด ๋‹ต์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  3. ์ตœ๋Œ€ ํ•ฉ์„ ๋งŒ๋“  ๋ ˆ๋ฒจ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

BFS๋Š” O(N) ์‹œ๊ฐ„(๊ฐ ๋…ธ๋“œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธ)๊ณผ O(W) ์ถ”๊ฐ€ ๊ณต๊ฐ„์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ W๋Š” ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ๋„ˆ๋น„(๊ฐ€์žฅ ํฐ ๋ ˆ๋ฒจ์˜ ํฌ๊ธฐ)์ž…๋‹ˆ๋‹ค.

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

C++

class Solution {
public:
    int maxLevelSum(TreeNode* root) {
        if (!root) return 0;

        long long maxSum   = LLONG_MIN;   // handles negative values
        int       maxLevel = 1;
        int       curLevel = 1;

        queue q;
        q.push(root);

        while (!q.empty()) {
            int   sz       = q.size();
            long long levelSum = 0;

            for (int i = 0; i val;

                if (node->left)  q.push(node->left);
                if (node->right) q.push(node->right);
            }

            if (levelSum > maxSum) {
                maxSum   = levelSum;
                maxLevel = curLevel;
            }
            ++curLevel;
        }
        return maxLevel;
    }
};

ํŒŒ์ด์ฌ

from collections import deque
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def maxLevelSum(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0

        max_sum   = float('-inf')
        max_level = 1
        cur_level = 1

        q = deque([root])

        while q:
            level_sum = 0
            for _ in range(len(q)):
                node = q.popleft()
                level_sum += node.val
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)

            if level_sum > max_sum:
                max_sum   = level_sum
                max_level = cur_level

            cur_level += 1

        return max_level

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxLevelSum = function (root) {
    if (!root) return 0;

    let maxSum   = -Infinity;
    let maxLevel = 1;
    let curLevel = 1;

    const queue = [root];

    while (queue.length) {
        const levelSize = queue.length;
        let levelSum = 0;

        for (let i = 0; i  maxSum) {
            maxSum   = levelSum;
            maxLevel = curLevel;
        }
        ++curLevel;
    }

    return maxLevel;
};

Key Takeaways

  • **Breadthโ€‘First Search (BFS)**๋Š” โ€œ๋ ˆ๋ฒจโ€‘์ˆœ์„œโ€ ํŠธ๋ฆฌ ๋ฌธ์ œ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๊ธฐ๋ฒ•์ด๋‹ค.
  • queue(๋˜๋Š” Python์˜ deque)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๋ ˆ๋ฒจ์„ ๋…ธ๋“œ๋‹น O(1) ํ‰๊ท  ์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋…ธ๋“œ ๊ฐ’์ด ์Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ โ€œ์ตœ๋Œ€ ํ•ฉโ€์„ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’(LLONG_MIN, -Infinity, ๋˜๋Š” -inf)์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(N), ์—ฌ๊ธฐ์„œ N์€ ๋…ธ๋“œ ์ˆ˜์ด๋‹ค.
  • ๊ณต๊ฐ„ ๋ณต์žก๋„: O(W), ์—ฌ๊ธฐ์„œ W๋Š” ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ๋„ˆ๋น„์ด๋ฉฐ(์™„์ „ ๊ท ํ˜• ํŠธ๋ฆฌ์˜ ์ตœ์•… ๊ฒฝ์šฐ O(N)).

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

์ด ๋ฌธ์ œ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ํŠธ๋ฆฌ ์ˆœํšŒ ํŒจํ„ด์„ ์†Œ๊ฐœํ•˜๋Š” ํ›Œ๋ฅญํ•œ ์ž…๋ฌธ์„œ์ž…๋‹ˆ๋‹ค:

  • ๊ฒ€์ƒ‰ ์—”์ง„ ์ธ๋ฑ์‹ฑ์€ ์ข…์ข… BFS์™€ ์œ ์‚ฌํ•œ ํฌ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™ˆํŽ˜์ด์ง€์—์„œ ์‹œ์ž‘ํ•ด ํŽ˜์ด์ง€๋ฅผ ๋ ˆ๋ฒจ๋ณ„๋กœ ํƒ์ƒ‰ํ•˜๋ฉฐ, ๊ฐ€์žฅ โ€œ์ค‘์š”ํ•œโ€(์ตœ์ƒ์œ„) ์ฝ˜ํ…์ธ ๊ฐ€ ๋จผ์ € ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ์…œ ๋„คํŠธ์›Œํฌ ๋ถ„์„์—์„œ๋Š” ๊ฐ€์žฅ ํ™œ๋™์ด ๋งŽ์€ ๋ ˆ๋ฒจ์„ ์ฐพ๋Š” ๊ฒƒ์ด โ€œ์ตœ๋Œ€ ๋ ˆ๋ฒจ ํ•ฉโ€ ๊ฐœ๋…์„ ๋ฐ˜์˜ํ•˜๋ฉฐ, ๊ฐ€์žฅ ์˜ํ–ฅ๋ ฅ ์žˆ๋Š” ์‚ฌ์šฉ์ž โ€œ์ธตโ€์„ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

BFS์™€ ํ ๊ด€๋ฆฌ์— ๋Šฅ์ˆ™ํ•ด์ง€๋ฉด ๋‹ค์–‘ํ•œ ์‹ค์ œ ๊ทธ๋ž˜ํ”„ ๋ฐ ํŠธ๋ฆฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์—ญ๋Ÿ‰์„ ๊ฐ–์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋”ฉ์„ ์ฆ๊ธฐ์„ธ์š”!

๊ฐ€์žฅ ์œ ๋งํ•œ ๋ถ„๋ฆฌ ์ฐจ์ˆ˜ ์‹๋ณ„

๊ทธ๋ž˜ํ”„ ๋ถ„์„์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ์ž ์žฌ์  ์—ฐ๊ฒฐ์„ ํฌํ•จํ•˜๋Š” **โ€œdegree of separationโ€**์„ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•œ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. Breadthโ€‘First Search (BFS) ๋ฅผ ์ˆ™๋‹ฌํ•˜๋Š” ๊ฒƒ์€ Google์ด๋‚˜ Meta์™€ ๊ฐ™์€ ๊ธฐ์—…์˜ ๊ธฐ์ˆ  ๋ฉด์ ‘์—์„œ ํ•ต์‹ฌ ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

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