Study/Algorithm

LeetCode (C/C++) 1314. Matrix Block Sum

hwooo 2024. 6. 7. 16:03

https://leetcode.com/problems/matrix-block-sum/


풀이

문제의 요구사항을 그대로 구현했더니 시간이 오래 걸려서 누적합 방식으로 다시 풀었다.

코드 1 - 요구사항 그대로

class Solution {
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
        int m = mat.size(), n = mat[0].size();
        vector<vector<int>> ans;
        for (int i = 0; i < m; i++) {
            vector<int> col;
            for (int j = 0; j < n; j++) {
                col.push_back(getAnswer(max(0, i - k), min(i + k, m - 1), max(j - k, 0), min(j + k, n - 1), mat));
            }
            ans.push_back(col);
        }
        return ans;
    }

    int getAnswer(int r1, int r2, int c1, int c2, vector<vector<int>>& mat) {
        int sum = 0;
        for (int r = r1; r <= r2; r++) {
            for (int c = c1; c <= c2; c++) {
                sum += mat[r][c];
            }
        }
        return sum;
    }
};

 

코드 2 - 누적합

class Solution {
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
        int m = mat.size(), n = mat[0].size();
        int sum[101][101] = {0, };

        sum[0][0] = mat[0][0];
        for (int i = 1; i < m; i++) sum[i][0] = mat[i][0] + sum[i - 1][0];
        for (int j = 1; j < n; j++) sum[0][j] = mat[0][j] + sum[0][j - 1];

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                sum[i][j] = mat[i][j] + sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1];
            }
        }
        vector<vector<int>> ans;
        for (int i = 0; i < m; i++) {
            vector<int> col;
            for (int j = 0; j < n; j++) {
                int val = sum[min(i + k, m - 1)][min(j + k, n - 1)];
                int flag = 0;
                if (i - k - 1 >= 0){
                    val -= sum[i - k - 1][min(j + k, n - 1)];
                    flag++;
                }
                if (j - k - 1 >= 0){
                    val -= sum[min(i + k, m - 1)][j - k - 1];
                    flag++;
                }
                if (flag == 2)
                    val += sum[max(i - k - 1, 0)][max(j - k - 1, 0)];
                col.push_back(val);
            }
            ans.push_back(col);
        }
        return ans;
    }
};