π§± μ΄λ³΄μμ© κ°μ΄λ β그리λμμ μ μ¬κ°ν ꡬλ©μ λ©΄μ μ΅λνβ β 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 μ€μΊμΌλ‘ λ³ννλ©°, μμ ν λΉ, μλμ° κ΄λ¦¬ λ° κΈ°ν μ€μ μμ§λμ΄λ§ μλ리μ€μμ μμ£Ό μ μ©ν κΈ°λ²μ λλ€.