코딩 테스트 및 알고리즘/leetcode for google
leetcode medium : Set Matrix Zeroes
띠리링구
2023. 2. 16. 03:03
https://leetcode.com/problems/set-matrix-zeroes/description/
Set Matrix Zeroes
풀기 전
- 첫 row와 column에 마킹을 해두면 될거같다.
코드 설명
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
firstRowZero = False
firstColZero = False
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == 0:
if i == 0:
firstRowZero = True
if j == 0:
firstColZero = True
matrix[0][j] = 0
matrix[i][0] = 0
for i in range(1, len(matrix)):
if matrix[i][0] == 0:
matrix[i] = [0] * len(matrix[0])
for j in range(1, len(matrix[0])):
if matrix[0][j] == 0:
for i in range(len(matrix)):
matrix[i][j] = 0
if firstRowZero:
matrix[0] = [0] * len(matrix[0])
if firstColZero:
for i in range(len(matrix)):
matrix[i][0] = 0
첫 row와 첫 column을 상태 저장용으로 쓴다. 값이 0인게 발견되면 해당 row와 column의 첫요소를 0으로 마킹해둔다. 그리고 나중에 첫 row와 column을 스캔해가면서 값이 0이면 해당 row나 column을 0으로 치환한다.
주의할점은 matrix[0][0]인데, 첫 row나 column에 0이 있으면 matrix[0][0]도 0으로 마킹된다. matrix[0][0]이 0으로 마킹되는건 3가지 의미를 가질 수 있다.
- 첫 row가 0으로 초기화 되어야 한다.
- 첫 column이 0으로 초기화 되어야 한다.
- 둘다 0으로 초기화 되어야 한다.
이를 관리하기 위해 두 가지 상태값을 따로 만들어준다. (firstRowZero, firstColZero)
복잡도 분석
공간복잡도는 당연히 O(1)이고
시간복잡도는 O(MN)이다.