๐งฑ ์ด๋ณด์์ฉ ๊ฐ์ด๋ โ๊ทธ๋ฆฌ๋์์ ์ ์ฌ๊ฐํ ๊ตฌ๋ฉ์ ๋ฉด์ ์ต๋ํโ โ LeetCode 2943 (C++, Python, JavaScript)
Source: Dev.to
๋ฒ์ญํ ํ ์คํธ๊ฐ ์ ๊ณต๋์ง ์์์ต๋๋ค. ๋ฒ์ญ์ด ํ์ํ ๋ณธ๋ฌธ์ ์๋ ค์ฃผ์๋ฉด ํ๊ตญ์ด๋ก ๋ฒ์ญํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋ฌธ์ ๊ฐ์
์ฃผ์ด์ง ๋ด์ฉ:
- ๋ ์ ์
n์m์ ๊ฒฉ์์์ ๋ด๋ถ ๊ฐ๋ก ๋ง๋์ ์ธ๋ก ๋ง๋์ ๊ฐ์์ ๋๋ค. - ๋ ๋ฐฐ์ด
hBars์vBars๋ ์ ๊ฑฐํ ์ ์๋ ํน์ ๋ง๋๋ค์ ๋์ดํฉ๋๋ค.
๊ฒฉ์๋ ๋ง๋๋ก ๊ตฌ๋ถ๋ ์ ๋ค๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. ์ฐ์๋ ๋ง๋๋ฅผ ์ ๊ฑฐํ๋ฉด ๋จ์ ์๋ ๊ณ ์ ๋ง๋ ์ฌ์ด์ ๊ณต๊ฐ์ด ํฉ์ณ์ง๋๋ค.
- ๋ง๋ ํ๋๋ฅผ ์ ๊ฑฐํ๋ฉด 2 ๋จ์์ ํ์ด ์๊น๋๋ค.
- ์ฐ์๋
k๊ฐ์ ๋ง๋๋ฅผ ์ ๊ฑฐํ๋ฉด kโฏ+โฏ1 ๋จ์์ ํ์ด ์๊น๋๋ค.
๋ชฉํ๋ ์ ๊ฑฐ ๊ฐ๋ฅํ ๋ง๋๋ฅผ ไปปๆ(์ด๋ค) ๊ฐ์๋งํผ ์ ๊ฑฐํ์ ๋ ๋ง๋ค ์ ์๋ ์ ์ฌ๊ฐํ ๊ตฌ๋ฉ์ ์ต๋ ๋ฉด์ ์ ์ฐพ๋ ๊ฒ์ ๋๋ค.
ํต์ฌ ํต์ฐฐ
๋ฌธ์ ๋ ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ 1โD ํ์ ๋ฌธ์ ๋ก ๋๋ ์ ์๋ค:
- ์ํ ๋ฐฉํฅ โ ์ฐ์์ ์ผ๋ก ์ ๊ฑฐ ๊ฐ๋ฅํ ์ํ ๋ง๋์ ๊ฐ์ฅ ๊ธด ์ฐ์ ๊ตฌ๊ฐ์ ์ฐพ๋๋ค.
- ์์ง ๋ฐฉํฅ โ ์ฐ์์ ์ผ๋ก ์ ๊ฑฐ ๊ฐ๋ฅํ ์์ง ๋ง๋์ ๊ฐ์ฅ ๊ธด ์ฐ์ ๊ตฌ๊ฐ์ ์ฐพ๋๋ค.
๊ฐ์ฅ ๊ธด ์ํ ์ฐ์ ๊ตฌ๊ฐ์ ๊ธธ์ด๊ฐ h์ด๋ฉด, ์ต๋ ์ํ ๊ฐ๊ฒฉ์ hโฏ+โฏ1์ด๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, ๊ธธ์ด๊ฐ v์ธ ์์ง ์ฐ์ ๊ตฌ๊ฐ์ ์์ง ๊ฐ๊ฒฉ vโฏ+โฏ1์ ๋ง๋ ๋ค.
๊ตฌ๋ฉ์ ์ ์ฌ๊ฐํ์ด์ด์ผ ํ๋ฏ๋ก, ๋ณ์ ๊ธธ์ด๋ ๋ ๊ฐ๊ฒฉ ์ค ๋ ์์ ๊ฐ์ ์ํด ์ ํ๋๋ค:
side = min(maxHorizontalGap, maxVerticalGap)
area = side * side
Source: โฆ
์๊ณ ๋ฆฌ์ฆ
- ๊ฐ ๋ฐฐ์ด(
hBars,vBars)์ ์ ๋ ฌํ๋ค. - ์ ๋ ฌ๋ ๋ฐฐ์ด์ ํ ๋ฒ ์ค์บํ์ฌ ์ฐ์๋ ์ซ์์ ๊ฐ์ฅ ๊ธด ์ฐ์ ๊ตฌ๊ฐ ๊ธธ์ด๋ฅผ ๊ณ์ฐํ๋ค.
- ํด๋น ๋ฐฉํฅ์ ์ต๋ ๊ฐ๊ฒฉ์ผ๋ก
longestRun + 1์ ๋ฐํํ๋ค. - ๋ ๊ฐ๊ฒฉ ์ค ์ต์๊ฐ์ ๋ณ์ ๊ธธ์ด๋ก ์ ํ๊ณ , ์ด๋ฅผ ์ ๊ณฑํ๋ค.
์์ฌ์ฝ๋
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 ์ค์บ์ผ๋ก ๋ณํํ๋ฉฐ, ์์ ํ ๋น, ์๋์ฐ ๊ด๋ฆฌ ๋ฐ ๊ธฐํ ์ค์ ์์ง๋์ด๋ง ์๋๋ฆฌ์ค์์ ์์ฃผ ์ ์ฉํ ๊ธฐ๋ฒ์ ๋๋ค.