๐ฒ ์ด๋ณด์์ฉ ๊ฐ์ด๋ โMaximum Side Length of a Squareโ โ LeetCode 1292 (C++, Python, JavaScript)
Source: Dev.to

๋ฌธ์ ์์ฝ
์ฃผ์ด์ง๋ ๊ฒ
mat๋ผ๋ ์ด๋ฆ์ ์ ์ 2โD ํ๋ ฌ.threshold๋ผ๋ ์ ์.
๋ชฉํ
์์๋ค์ ํฉ์ด โคโฏthreshold ์ธ ์ ์ฌ๊ฐํ ๋ถ๋ถ ํ๋ ฌ ์ค ์ต๋ ๋ณ์ ๊ธธ์ด๋ฅผ ๋ฐํํฉ๋๋ค.
๊ทธ๋ฌํ ์ ์ฌ๊ฐํ์ด ์์ผ๋ฉด 0์ ๋ฐํํฉ๋๋ค.
๋จ๊ณ๋ณ ์๋ด: ์์ ์ดํด
์์ โฏ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
์ด ๋ฌธ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํ๊ธฐ ์ํด ๋ ๊ฐ์ง ๊ฐ๋ ฅํ ๊ธฐ๋ฒ์ ๊ฒฐํฉํฉ๋๋ค:
- 2โD Prefix Sums โ ํ๋ ฌ์ ๋ฏธ๋ฆฌ ์ฒ๋ฆฌํด ์ด๋ค ์ ์ฌ๊ฐํ์ ํฉ๋ O(1) ์๊ฐ์ ๊ตฌํ ์ ์๊ฒ ํฉ๋๋ค.
- 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์ ๋ง์คํฐํ๋ฉด ํ๋ ฌ ์กฐ์๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ์ธํฐ๋ทฐ์์ ํฐ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.