m x n
νλ ¬μ΄ μ£Όμ΄μ‘μ λ λΆλΆ νλ ¬ μμμ ν©μ΄ μ£Όμ΄μ§ μ«μ target
μ΄ λλ κ²½μ°μ μλ₯Ό ꡬνλ λ¬Έμ .- νλ ¬μ μ΅λ ν¬κΈ°λ
100 x 100
μ΄λ€.
- λ¨μνκ² λͺ¨λ κ²½μ°μ μλ₯Ό μλν΄λ³΄λ κ²½μ° μκ° λ³΅μ‘λλ μ΄ λλ€.
- λ¨Όμ λͺ¨λ λΆλΆ νλ ¬μ κ²½μ°μ μλ
m == n
μμ κ°μ νμ λ μ΄λ€. - νλ ¬μ ν μμ μ , λμ , μ΄ μμμ , λμ κ°κ°μ λͺ¨λ μλν΄λ³΄μμΌ νλ€.
- λλΆμ΄ κ° λΆλΆ νλ ¬μ λν΄μ λͺ¨λ μμλ₯Ό λνλ κ²μ μ μκ° λ³΅μ‘λλ₯Ό κ°μ§λ€.
- μ΄λ―λ‘ μμ μ€ν μκ°μ κ°λμ΄ λλ―λ‘ μκ° μ΄κ³Όκ° λλ€ (kλ λ‘μ§μ 1ν μ€ννλ μκ°).
- μ΄λ₯Ό μ€μ΄κΈ° μν΄ prefixed sumμ νμ©νλ€.
- νλ ¬μ κ° νμ λνμ¬ μ²«λ²μ§Έ μ΄ λΆν° λ§μ§λ§ μ΄ κΉμ§ λμ λ ν©μ 미리 κ³μ°νμ¬ 2d λ°°μ΄
pSum
μ μ μ₯νλ€. - λ¨, κ³μ°μ νΈμλ₯Ό μν΄μ μ΄μ κ°μ + 1
n + 1
λ§νΌ 곡κ°μ μ‘κ³ 1
λ²μ¨° μ΄ λΆν° κ°μ μ μ₯νλ€. - μ΄λ κ² νλ©΄
[a, b]
μ΄ λ²μμ κ°μ ꡬν λ pSum[b + 1] - pSum[a]
μ κ°μ΄ ꡬν μ μλ€. - μ΄ λ²μμ κ°μ λνλ μκ° λ³΅μ‘λλ₯Ό μμ λ‘ κ°μμν¬ μ μλ€.
- λͺ¨λ λΆλΆ νλ ¬μ κ²½μ°μ μμ λν΄μ μμμ ν©μ ꡬνκ³ κ·Έ κ°μ΄ μ£Όμ΄μ§ μ«μ
target
μ λμΌν κ²½μ°μ μλ₯Ό μΌλ€. - λΆλΆ νλ ¬μ ν λ²μ
[si, ei]
, μ΄ λ²μ [sj, ej]
μ λν΄μ μμμ ν©μ 미리 κ³μ°λ prefixed sum λ°°μ΄μ μ΄μ©νμ¬ κ΅¬νλ€ β . - 루ν μμλ₯Ό λ°κΏμ κ° ν λ³ prefixed sumμ λνλ 루νμ λΆλΆ νλ ¬μ κ²½μ°μ μλ₯Ό νμνλ 루νλ₯Ό ν΅ν©νλ€ β .
- μ΅μ’
μ μΌλ‘ μκ° λ³΅μ‘λλ κ° λλ€.
class Solution {
public int numSubmatrixSumTarget(int[][] matrix, int target) {
int result = 0;
int m = matrix.length, n = matrix[0].length;
int[][] pSum = new int[m][n + 1];
for (int i = 0; i < m; ++i) {
for (int j = 1; j <= n; ++j) {
pSum[i][j] = pSum[i][j - 1] + matrix[i][j - 1];
}
}
for (int sj = 0; sj < n; ++sj) { // μ΄μ μμμ
for (int ej = sj; ej < n; ++ej) { // μ΄μ λμ
for (int si = 0; si < m; ++si) { // νμ μμμ
int sum = 0;
for (int ei = si; ei < m; ++ei) { // νμ λμ
sum += pSum[ei][ej + 1] - pSum[ei][sj];
if (target == sum) ++result;
}
}
}
}
return result;
}
}
- 루ν μμλ₯Ό λ°κΎΈμ§ μμΌλ©΄ μλμ κ°μ΄ λλλ° λ§μ§λ§μ ν λ³λ‘ prefixed sumμ λνλ λΆλΆ λλ¬Έμ μκ° λ³΅μ‘λκ° κ° λμ μκ° μ΄κ³Όκ° λλ€.
- (2), (5) λ² λ£¨νλ λκ°μ΄ ν λ²μλ₯Ό λ°λΌ μμ§μ΄λ―λ‘ μ΄λ₯Ό ν΅ν©νμ¬ μμμ ν©μ κ³μ°νλ λΆλΆμ λ¨μνν μ μλ€.
class Solution {
public int numSubmatrixSumTarget(int[][] matrix, int target) {
... omitted ...
for (int si = 0; si < m; ++si) { // (1) νμ μμμ
for (int ei = si; ei < m; ++ei) { // (2) νμ λμ : si ~ eiλ₯Ό λ°λΌμ μν
for (int sj = 0; sj < n; ++sj) { // (3) μ΄μ μμμ
for (int ej = sj; ej < n; ++ej) { // (4) μ΄μ λμ
int sum = 0;
for (int i = si; i <= ei; ++i) { // (5) si ~ eiκΉμ§ μν
sum += pSum[i][ej + 1] - pSum[i][sj];
}
if (target == sum) {
++result;
}
}
}
}
}
return result;
}
}