문제

풀이

$O(M * N)$ 공간 풀이

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        vector<pair<int, int>> v;
        v.reserve(m * n);

        for (int i = 0; i < m; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                if (matrix[i][j] == 0)
                {
                    v.push_back({i, j});
                }
            }
        }

        for (auto coord : v)
        {
            int x = coord.first;
            int y = coord.second;

            // 행
            for (int i = 0; i < n; ++i)
            {
                matrix[x][i] = 0;
            }

            // 열
            for (int i = 0; i < m; ++i)
            {
                matrix[i][y] = 0;
            }
        }
    }
};

추가적인 메모리를 할당하는 풀이이다. 별도의 배열에 0의 위치를 기록해놓고, 이를 순회하면서 행과 열을 0으로 채운다.

$O(1)$ 공간 풀이

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int r = matrix.size();
        int c = matrix[0].size();

        bool isFirstColZero = false;
        for (int i = 0; i < r; ++i)
        {
            if (matrix[i][0] == 0) 
            {
                isFirstColZero = true;
            }

            for (int j = 1; j < c; ++j)
            {
                if (matrix[i][j] == 0)
                {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }

        for (int i = 1; i < r; ++i)
        {
            for (int j = 1; j < c; ++j)
            {
                if (matrix[i][0] == 0 || matrix[0][j] == 0) 
                {
                    matrix[i][j] = 0;
                }
            }
        }

        if (matrix[0][0] == 0) 
        {
            for (int j = 0; j < c; j++) 
            {
                matrix[0][j] = 0;
            }
        }

        if (isFirstColZero) 
        {
            for (int i = 0; i < r; i++) 
            {
                matrix[i][0] = 0;
            }
        }
    }
};

추가적인 메모리를 할당하지 않는 풀이이다. 핵심 아이디어는 이렇다.

  • 각 행과 열에는 반드시 첫 번째 요소는 존재한다.
  • 이를 활용하여 각 행과 열의 첫 번째 요소를 마킹용으로 사용한다.
  • matrix[i][0]: i번째 행 전체를 0으로 만들어야 한다는 의미
  • matrix[0][j]: j번째 열 전체를 0으로 만들어야 한다는 의미

그런데 엣지 케이스가 있다. matrix[0][0]은 0번째 행인지, 0번째 열인지 구분할 수 없다. 해결을 위해 다음과 같이 약속하자.

  • matrix[0][0]은 0번째 행을 의미
  • 0번째 열은 별도의 플래그를 둠

이상을 종합해서 코드로 옮기면 위 풀이와 같다.

배운 점과 후기

O(1) 공간 풀이 같은건 어떻게 생각하는거지…

이 포스트는 달레 스터디(7주차)에서 진행한 Blind 75 문제집 풀이의 일부입니다.

댓글남기기