๐Ÿ”ฒ ์ดˆ๋ณด์ž์šฉ ๊ฐ€์ด๋“œ โ€˜Maximum Side Length of a Squareโ€™ โ€“ LeetCode 1292 (C++, Python, JavaScript)

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

Source: Dev.to

โ€˜Maximum Side Length of a Squareโ€™ ์ดˆ๋ณด์ž ์นœํ™” ๊ฐ€์ด๋“œ ํ‘œ์ง€ ์ด๋ฏธ์ง€ โ€“ LeetCode 1292 (C++, Python, JavaScript)

๋ฌธ์ œ ์š”์•ฝ

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

  • mat ๋ผ๋Š” ์ด๋ฆ„์˜ ์ •์ˆ˜ 2โ€‘D ํ–‰๋ ฌ.
  • threshold ๋ผ๋Š” ์ •์ˆ˜.

๋ชฉํ‘œ

์š”์†Œ๋“ค์˜ ํ•ฉ์ด โ‰คโ€ฏthreshold ์ธ ์ •์‚ฌ๊ฐํ˜• ๋ถ€๋ถ„ ํ–‰๋ ฌ ์ค‘ ์ตœ๋Œ€ ๋ณ€์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌํ•œ ์ •์‚ฌ๊ฐํ˜•์ด ์—†์œผ๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„๋ณ„ ์•ˆ๋‚ด: ์˜ˆ์ œ ์ดํ•ด

์˜ˆ์ œโ€ฏ1

์˜ˆ์ œ 1 ์ผ๋Ÿฌ์ŠคํŠธ

์ž…๋ ฅ

mat = [
  [1,1,3,2,4,3,2],
  [1,1,3,2,4,3,2],
  [1,1,3,2,4,3,2]
]
threshold = 4
  • ๋ณ€์˜ ๊ธธ์ดโ€ฏ1 โ†’ ๋‹จ์ผ 1์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ€์˜ ๊ธธ์ดโ€ฏ2 โ†’ ์ขŒ์ƒ๋‹จ ์ •์‚ฌ๊ฐํ˜• [[1,1],[1,1]]์˜ ํ•ฉ์ด 4์ด๋ฉฐ โ†’ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ€์˜ ๊ธธ์ดโ€ฏ3 โ†’ ๊ฐ€์žฅ ์ž‘์€ 3ร—3 ์ •์‚ฌ๊ฐํ˜•์˜ ํ•ฉ์ด ์ด๋ฏธ 4๋ฅผ ์ดˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ

2

์˜ˆ์ œโ€ฏ2

์ž…๋ ฅ

mat = [
  [2,2,2,2,2],
  [2,2,2,2,2],
  ...
]
threshold = 1

๋ชจ๋“  ์š”์†Œ๊ฐ€ 2์ด๋ฏ€๋กœ 1ร—1 ์ •์‚ฌ๊ฐํ˜•์กฐ์ฐจ๋„ ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ

0

Intuition

์ด ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ’€๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋ฒ•์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค:

  1. 2โ€‘D Prefix Sums โ€“ ํ–‰๋ ฌ์„ ๋ฏธ๋ฆฌ ์ฒ˜๋ฆฌํ•ด ์–ด๋–ค ์ •์‚ฌ๊ฐํ˜•์˜ ํ•ฉ๋„ O(1) ์‹œ๊ฐ„์— ๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  2. Binary Search on the answer โ€“ ์ •์‚ฌ๊ฐํ˜•์˜ ๋ณ€ ๊ธธ์ด๋Š” ๋‹จ์กฐ์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค: ํฌ๊ธฐ k์ธ ์ •์‚ฌ๊ฐํ˜•์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด, ๋” ์ž‘์€ ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•๋„ ๋ชจ๋‘ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด ์ตœ๋Œ€ ๊ฐ€๋Šฅํ•œ k๋ฅผ O(logโ€ฏmin(m,n)) ์‹œ๊ฐ„์— ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ 2โ€‘D Prefix Sum

preSum[i][j]๋Š” ์ขŒ์ƒ๋‹จ ์ฝ”๋„ˆ (0,0)๋ถ€ํ„ฐ (iโ€‘1, jโ€‘1)๊นŒ์ง€ (ํฌํ•จ) ์‚ฌ๊ฐํ˜•์˜ ํ•ฉ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ณ€ ๊ธธ์ด๊ฐ€ len์ด๊ณ  ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์ฝ”๋„ˆ๊ฐ€ (i, j)์ธ ์ •์‚ฌ๊ฐํ˜•์˜ ํ•ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

sum = preSum[i][j]
      - preSum[iโ€‘len][j]
      - preSum[i][jโ€‘len]
      + preSum[iโ€‘len][jโ€‘len]

preSum ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ธ๋ฑ์Šค๋Š” 1โ€‘๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์œ„ ์‹์€ O(1) ์— ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ Binary Search on Answer

  • Lowโ€ฏ=โ€ฏ0, Highโ€ฏ=โ€ฏmin(rows, cols).
  • low โ‰ค high ์ธ ๋™์•ˆ ๋ฐ˜๋ณต:
    • mid = (low + high) // 2.
    • prefix sum์„ ์ด์šฉํ•ด mid ร— mid ์ •์‚ฌ๊ฐํ˜• ์ค‘ ํ•ฉ์ด โ‰คโ€ฏthreshold ์ธ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐœ๊ฒฌ๋˜๋ฉด mid๋ฅผ ํ›„๋ณด๋กœ ๊ธฐ๋กํ•˜๊ณ  ๋” ํฐ ํฌ๊ธฐ๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค (low = mid + 1).
    • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋” ์ž‘์€ ํฌ๊ธฐ๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค (high = mid - 1).

์ „์ฒด ๋ณต์žก๋„๋Š” O(mยทnโ€ฏ+โ€ฏmยทnยทlogโ€ฏmin(m,n)) ๋กœ, prefixโ€‘sum ๊ตฌ์ถ•๊ณผ binaryโ€‘search ๊ฒ€์‚ฌ๊ฐ€ ์ง€๋ฐฐํ•ฉ๋‹ˆ๋‹ค.

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

C++ (๋ถ€๋ถ„)

class Solution {
public:
    int maxSideLength(vector<vector<int>>& mat, int threshold) {
        int m = mat.size();
        int n = mat[0].size();
        vector<vector<int>> preSum(m + 1, vector<int>(n + 1, 0));

        // Build 2โ€‘D Prefix Sum
        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                preSum[i][j] = mat[i-1][j-1] + preSum[i-1][j] + preSum[i][j-1] - preSum[i-1][j-1];
            }
        }
        // ... (rest of the algorithm)
    }
};

Python (๋ถ€๋ถ„)

class Solution:
    def maxSideLength(self, mat: List[List[int]], threshold: int) -> int:
        m, n = len(mat), len(mat[0])
        preSum = [[0] * (n + 1) for _ in range(m + 1)]

        # Build 2โ€‘D Prefix Sum
        for i in range(1, m + 1):
            for j in range(1, n + 1):
                preSum[i][j] = (mat[i - 1][j - 1] +
                                preSum[i - 1][j] +
                                preSum[i][j - 1] -
                                preSum[i - 1][j - 1])

        def check(k: int) -> bool:
            if k == 0:
                return True
            for i in range(k, m + 1):
                for j in range(k, n + 1):
                    cur = (preSum[i][j] -
                           preSum[i - k][j] -
                           preSum[i][j - k] +
                           preSum[i - k][j - k])
                    if cur <= threshold:
                        return True
            return False

        # Binary search omitted for brevity

JavaScript (๋ถ€๋ถ„)

var maxSideLength = function(mat, threshold) {
    const m = mat.length, n = mat[0].length;
    const preSum = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));

    // Build 2โ€‘D Prefix Sum
    for (let i = 1; i <= m; ++i) {
        for (let j = 1; j <= n; ++j) {
            preSum[i][j] = mat[i - 1][j - 1] + preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1];
        }
    }

    const canFit = (k) => {
        if (k === 0) return true;
        for (let i = k; i <= m; ++i) {
            for (let j = k; j <= n; ++j) {
                const cur = preSum[i][j] - preSum[i - k][j] - preSum[i][j - k] + preSum[i - k][j - k];
                if (cur <= threshold) return true;
            }
        }
        return false;
    };

    // Binary search omitted for brevity
};

์ •๋ฆฌ๋œ JavaScript ๊ตฌํ˜„

for (let i = 1; i <= m; i++) {
    for (let j = 1; j <= n; j++) {
        preSum[i][j] = mat[i - 1][j - 1] + preSum[i - 1][j] + 
                       preSum[i][j - 1] - preSum[i - 1][j - 1];
    }
}

let low = 0;
let high = Math.min(m, n);
let ans = 0;

while (low <= high) {
    let mid = Math.floor(low + (high - low) / 2);
    if (mid === 0) {
        low = mid + 1;
        continue;
    }

    let found = false;
    for (let i = mid; i <= m; i++) {
        for (let j = mid; j <= n; j++) {
            let currentSum = preSum[i][j] - preSum[i - mid][j] -
                             preSum[i][j - mid] + preSum[i - mid][j - mid];
            if (currentSum <= threshold) {
                found = true;
                break;
            }
        }
        if (found) break;
    }

    if (found) {
        ans = mid;
        low = mid + 1;
    } else {
        high = mid - 1;
    }
}
return ans;

์ฃผ์š” ๋‚ด์šฉ

  • 2D Prefix Sums: ์ด ๊ธฐ๋ฒ•์€ ์ „์ฒ˜๋ฆฌ ํ›„ ์˜์—ญ ํ•ฉ ์ฟผ๋ฆฌ๋ฅผ *O(kยฒ)*์—์„œ O(1) ๋กœ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฒฉ์ž ๊ธฐ๋ฐ˜ ๋ฌธ์ œ์—์„œ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Binary Search on Results: ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” โ€œ์ตœ๋Œ€โ€ ๋˜๋Š” โ€œ์ตœ์†Œโ€ ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•  ๋•Œ, ํƒ์ƒ‰ ๊ณต๊ฐ„์ด ์ •๋ ฌ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ด์ง„ ํƒ์ƒ‰์„ ์ ์šฉํ•˜์„ธ์š”.
  • Inclusionโ€‘Exclusion Principle: ์ ‘๋‘ํ•ฉ ๋ฐ ์˜์—ญ ํ•ฉ ๊ณต์‹์€ ์ด ์›๋ฆฌ๋ฅผ ์ง์ ‘ ์ ์šฉํ•œ ๊ฒƒ์œผ๋กœ, ๊ฒน์น˜๋Š” ์˜์—ญ์„ ์ค‘๋ณต ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

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

์ด ๋ฌธ์ œ๋Š” ๋‘ ๊ฐœ์˜ ๋น„๊ต์  ๋‹จ์ˆœํ•œ ๊ฐœ๋…์„ ๊ฒฐํ•ฉํ•˜๋ฉด ๋งค์šฐ ์ตœ์ ํ™”๋œ ์†”๋ฃจ์…˜์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ํ›Œ๋ฅญํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์„ธ๊ณ„์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๊ณต๊ฐ„ ์ฟผ๋ฆฌ๊ฐ€ Computer Vision์—์„œ ๊ฐ์ฒด ํƒ์ง€์—, ๊ทธ๋ฆฌ๊ณ  **Geographic Information Systems (GIS)**์—์„œ ํŠน์ • ์ง€๋„ ์˜์—ญ ๋‚ด ๋ฐ์ดํ„ฐ ๋ฐ€๋„๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 2D prefix sum์„ ๋งˆ์Šคํ„ฐํ•˜๋ฉด ํ–‰๋ ฌ ์กฐ์ž‘๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ธํ„ฐ๋ทฐ์—์„œ ํฐ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

๐ŸŽฏ ์ดˆ๋ณด์ž์šฉ ๊ฐ€์ด๋“œ 'N-Repeated Element in Size 2N Array' โ€“ LeetCode 961 (C++ | Python | JavaScript)

๋ฌธ์ œ ์„ค๋ช… ๊ธธ์ด๊ฐ€ 2N์ธ ๋ฐฐ์—ด nums๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๋ฐฐ์—ด์—๋Š” N + 1๊ฐœ์˜ ๊ณ ์œ ํ•œ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ทธ ์ค‘ ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์š”์†Œ๊ฐ€ N๋ฒˆ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋ชฉํ‘œ...

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

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