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

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

Source: Dev.to

๋ฒˆ์—ญํ•  ํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฒˆ์—ญ์ด ํ•„์š”ํ•œ ๋ณธ๋ฌธ์„ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ๊ฐœ์š”

์ฃผ์–ด์ง„ ๋‚ด์šฉ:

  • ๋‘ ์ •์ˆ˜ n์™€ m์€ ๊ฒฉ์ž์—์„œ ๋‚ด๋ถ€ ๊ฐ€๋กœ ๋ง‰๋Œ€์™€ ์„ธ๋กœ ๋ง‰๋Œ€์˜ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ๋‘ ๋ฐฐ์—ด hBars์™€ vBars๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๋ง‰๋Œ€๋“ค์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

๊ฒฉ์ž๋Š” ๋ง‰๋Œ€๋กœ ๊ตฌ๋ถ„๋œ ์…€๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ์†๋œ ๋ง‰๋Œ€๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋‚จ์•„ ์žˆ๋Š” ๊ณ ์ • ๋ง‰๋Œ€ ์‚ฌ์ด์˜ ๊ณต๊ฐ„์ด ํ•ฉ์ณ์ง‘๋‹ˆ๋‹ค.

  • ๋ง‰๋Œ€ ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด 2 ๋‹จ์œ„์˜ ํ‹ˆ์ด ์ƒ๊น๋‹ˆ๋‹ค.
  • ์—ฐ์†๋œ k๊ฐœ์˜ ๋ง‰๋Œ€๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด kโ€ฏ+โ€ฏ1 ๋‹จ์œ„์˜ ํ‹ˆ์ด ์ƒ๊น๋‹ˆ๋‹ค.

๋ชฉํ‘œ๋Š” ์ œ๊ฑฐ ๊ฐ€๋Šฅํ•œ ๋ง‰๋Œ€๋ฅผ ไปปๆ„(์–ด๋–ค) ๊ฐœ์ˆ˜๋งŒํผ ์ œ๊ฑฐํ–ˆ์„ ๋•Œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ •์‚ฌ๊ฐํ˜• ๊ตฌ๋ฉ์˜ ์ตœ๋Œ€ ๋ฉด์ ์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ํ†ต์ฐฐ

๋ฌธ์ œ๋Š” ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ 1โ€‘D ํ•˜์œ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค:

  1. ์ˆ˜ํ‰ ๋ฐฉํ–ฅ โ€“ ์—ฐ์†์ ์œผ๋กœ ์ œ๊ฑฐ ๊ฐ€๋Šฅํ•œ ์ˆ˜ํ‰ ๋ง‰๋Œ€์˜ ๊ฐ€์žฅ ๊ธด ์—ฐ์† ๊ตฌ๊ฐ„์„ ์ฐพ๋Š”๋‹ค.
  2. ์ˆ˜์ง ๋ฐฉํ–ฅ โ€“ ์—ฐ์†์ ์œผ๋กœ ์ œ๊ฑฐ ๊ฐ€๋Šฅํ•œ ์ˆ˜์ง ๋ง‰๋Œ€์˜ ๊ฐ€์žฅ ๊ธด ์—ฐ์† ๊ตฌ๊ฐ„์„ ์ฐพ๋Š”๋‹ค.

๊ฐ€์žฅ ๊ธด ์ˆ˜ํ‰ ์—ฐ์† ๊ตฌ๊ฐ„์˜ ๊ธธ์ด๊ฐ€ h์ด๋ฉด, ์ตœ๋Œ€ ์ˆ˜ํ‰ ๊ฐ„๊ฒฉ์€ hโ€ฏ+โ€ฏ1์ด๋‹ค.
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๊ธธ์ด๊ฐ€ v์ธ ์ˆ˜์ง ์—ฐ์† ๊ตฌ๊ฐ„์€ ์ˆ˜์ง ๊ฐ„๊ฒฉ vโ€ฏ+โ€ฏ1์„ ๋งŒ๋“ ๋‹ค.

๊ตฌ๋ฉ์€ ์ •์‚ฌ๊ฐํ˜•์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ, ๋ณ€์˜ ๊ธธ์ด๋Š” ๋‘ ๊ฐ„๊ฒฉ ์ค‘ ๋” ์ž‘์€ ๊ฐ’์— ์˜ํ•ด ์ œํ•œ๋œ๋‹ค:

side = min(maxHorizontalGap, maxVerticalGap)
area = side * side

Source: โ€ฆ

์•Œ๊ณ ๋ฆฌ์ฆ˜

  1. ๊ฐ ๋ฐฐ์—ด(hBars, vBars)์„ ์ •๋ ฌํ•œ๋‹ค.
  2. ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ ์Šค์บ”ํ•˜์—ฌ ์—ฐ์†๋œ ์ˆซ์ž์˜ ๊ฐ€์žฅ ๊ธด ์—ฐ์† ๊ตฌ๊ฐ„ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  3. ํ•ด๋‹น ๋ฐฉํ–ฅ์˜ ์ตœ๋Œ€ ๊ฐ„๊ฒฉ์œผ๋กœ longestRun + 1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  4. ๋‘ ๊ฐ„๊ฒฉ ์ค‘ ์ตœ์†Œ๊ฐ’์„ ๋ณ€์˜ ๊ธธ์ด๋กœ ์ •ํ•˜๊ณ , ์ด๋ฅผ ์ œ๊ณฑํ•œ๋‹ค.

์˜์‚ฌ์ฝ”๋“œ

function getMaxGap(bars):
    sort(bars)
    maxRun = 1
    curRun = 1
    for i from 1 to bars.length-1:
        if bars[i] == bars[i-1] + 1:
            curRun += 1
        else:
            curRun = 1
        maxRun = max(maxRun, curRun)
    return maxRun + 1   // gap width

function maximizeSquareHoleArea(n, m, hBars, vBars):
    side = min(getMaxGap(hBars), getMaxGap(vBars))
    return side * side

๋ณต์žก๋„ ๋ถ„์„

  • ๊ฐ ๋ฐฐ์—ด ์ •๋ ฌ: O(k log k) ์—ฌ๊ธฐ์„œ k๋Š” ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.
  • ์„ ํ˜• ์Šค์บ”: O(k).

์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n + m log m).
๊ณต๊ฐ„ ๋ณต์žก๋„: O(1) ์ถ”๊ฐ€ (์ œ์ž๋ฆฌ ์ •๋ ฌ).

์ฐธ๊ณ  ๊ตฌํ˜„

C++

class Solution {
public:
    int maximizeSquareHoleArea(int n, int m, std::vector<int>& hBars, std::vector<int>& vBars) {
        int side = std::min(getMaxGap(hBars), getMaxGap(vBars));
        return side * side;
    }

private:
    int getMaxGap(std::vector<int>& bars) {
        if (bars.empty()) return 1;          // no removable bars โ†’ gap of 1
        std::sort(bars.begin(), bars.end());

        int max_consecutive = 1;
        int current_consecutive = 1;

        for (size_t i = 1; i < bars.size(); ++i) {
            if (bars[i] == bars[i-1] + 1) {
                ++current_consecutive;
            } else {
                current_consecutive = 1;
            }
            max_consecutive = std::max(max_consecutive, current_consecutive);
        }
        return max_consecutive + 1;
    }
};

Python

def get_max_gap(bars: list[int]) -> int:
    if not bars:
        return 1
    bars.sort()
    max_consecutive = 1
    cur = 1
    for i in range(1, len(bars)):
        if bars[i] == bars[i - 1] + 1:
            cur += 1
        else:
            cur = 1
        max_consecutive = max(max_consecutive, cur)
    return max_consecutive + 1

def maximizeSquareHoleArea(n: int, m: int, hBars: list[int], vBars: list[int]) -> int:
    side = min(get_max_gap(hBars), get_max_gap(vBars))
    return side * side

JavaScript

/**
 * @param {number} n
 * @param {number} m
 * @param {number[]} hBars
 * @param {number[]} vBars
 * @return {number}
 */
var maximizeSquareHoleArea = function (n, m, hBars, vBars) {
    const getMaxGap = (bars) => {
        if (bars.length === 0) return 1;
        bars.sort((a, b) => a - b);
        let maxConsecutive = 1;
        let cur = 1;
        for (let i = 1; i < bars.length; i++) {
            if (bars[i] === bars[i - 1] + 1) {
                cur++;
            } else {
                cur = 1;
            }
            maxConsecutive = Math.max(maxConsecutive, cur);
        }
        return maxConsecutive + 1;
    };

    const side = Math.min(getMaxGap(hBars), getMaxGap(vBars));
    return side * side;
};

์ถ”๊ฐ€ ์„ค๋ช…

  • ์—ฐ์†์„ฑ์„ ์œ„ํ•œ ์ •๋ ฌ: ์ •๋ ฌ์€ ๋ฌธ์ œ๋ฅผ ๋‹จ์ผ ์„ ํ˜• ํŒจ์Šค๋กœ ์ถ•์†Œ์‹œ์ผœ ์ „์ฒด์ ์œผ๋กœ O(k log k) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํŽœ์Šคํฌ์ŠคํŠธ ๊ณ ๋ ค: k๊ฐœ์˜ ๋ง‰๋Œ€๊ฐ€ kโ€ฏ+โ€ฏ1๊ฐœ์˜ ๊ณต๊ฐ„์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค; ์ด๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๊ทธ ๊ณต๊ฐ„๋“ค์ด ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง‘๋‹ˆ๋‹ค.
  • ๋ณ‘๋ชฉ ์›์น™: ์ •์‚ฌ๊ฐํ˜• ํ˜•ํƒœ์˜ ์ œ์•ฝ์—์„œ๋Š” ๋” ์ž‘์€ ์ฐจ์›์ด ์ตœ์ข… ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ๋ฒ•์€ 2โ€‘D ๊ฒฉ์ž ๋ฌธ์ œ๋ฅผ ๋‘ ๊ฐœ์˜ ๊ฐ„๋‹จํ•œ 1โ€‘D ์Šค์บ”์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉฐ, ์ž์› ํ• ๋‹น, ์œˆ๋„์šฐ ๊ด€๋ฆฌ ๋ฐ ๊ธฐํƒ€ ์‹ค์ œ ์—”์ง€๋‹ˆ์–ด๋ง ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ž์ฃผ ์œ ์šฉํ•œ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

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