[LeetCode] 73 - Set Matrix Zeroes
문제
- 링크: https://leetcode.com/problems/set-matrix-zeroes
- 난이도: Medium
- 태그: 배열, 해시 테이블, 행렬
- 결과:
Time: 0 ms (100.00%), Space: 20.80 MB (54.25%)
풀이
$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) 공간 풀이 같은건 어떻게 생각하는거지…
댓글남기기