🧱 초보자용 κ°€μ΄λ“œ β€˜κ·Έλ¦¬λ“œμ—μ„œ μ •μ‚¬κ°ν˜• ꡬ멍의 면적 μ΅œλŒ€ν™”β€™ – LeetCode 2943 (C++, Python, JavaScript)

λ°œν–‰: (2026λ…„ 1μ›” 15일 μ˜€ν›„ 02:13 GMT+9)
6 λΆ„ μ†Œμš”
원문: 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

κ΄€λ ¨ κΈ€

더 보기 Β»