문제
m x n
의 integer 행렬
이 있을때, 만약 어떤 원소의 값이 0
이라면 해당 행과 열을 모두 0
으로 만들어야 한다.
해당 변수에 직접 수정해야 한다.
예시
Input: matrix = [[1,1,1],[1,0,1],[1,1,1]]
Output: [[1,0,1],[0,0,0],[1,0,1]]
Input: matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
Output: [[0,0,0,0],[0,4,5,0],[0,3,1,0]]
제약조건
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-231 <= matrix[i][j] <= 231 - 1
풀이 : 구현
쉬운 문제처럼 보이지만 살짝 함정이 있어 두 번 정도 고치면서 풀었다.
1. 0이 보이면 해당 행과 열을 모두 0으로 만들기
행렬의 모든 원소를 방문하다가 원소가 0이면 해당 원소의 행과 열을 0으로 만들었다.
하지만 이는 잘못된 논리였다.
방문하지 않은 원소를 0으로 만들어버리면 방문했을 때 해당 원소의 행과 열도 0으로 만들었다. 기각!
2. boolean 행렬으로 값이 변한 원소인지 확인하기
1번과 비슷하되 비교 연산을 하나 더했다.
boolean 행렬로 0으로 바뀐 원소인지 아닌지를 체크해서 원소가 0이라도 변한적이 있다면 다른 행과 열에 영향을 끼치지 않게 했다.
음, 작동이 잘 되었지만 조금 더 보완할 수 있을 것 같았다. 보류!
3. 0으로 바꿀 boolean 배열 확인하기
행렬의 모든 원소를 방문하다가 원소가 0이면 해당 행과 열에 해당하는 index에 true 값을 줬다.
그 후, 다시 모든 원소를 방문하고, 행이든 열이든 boolean 배열의 값이 true라면 해당 원소를 0으로 줬다. 통과!
코드는 아래와 같습니다.
class Solution {
public void setZeroes(int[][] matrix) {
boolean[] rowZero = new boolean[matrix.length];
boolean[] colZero = new boolean[matrix[0].length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
if (matrix[i][j] == 0) {
rowZero[i] = true;
colZero[j] = true;
}
}
}
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
if (rowZero[i] || colZero[j]) {
matrix[i][j] = 0;
}
}
}
}
}
어렵진 않으나 실수하기 쉬운 구현 문제였습니다.
의견 및 질문은 늘 환영합니다 :)
'LeetCode [Java]' 카테고리의 다른 글
[hard] 1383. Maximum Performance of a Team (1) | 2023.12.18 |
---|---|
[hard] 899. Orderly Queue (0) | 2023.12.14 |
[hard] 218. The Skyline Problem (0) | 2023.12.10 |
[medium] 39. Combination Sum (0) | 2023.12.09 |
[easy] 70. Climbing Stairs (2) | 2023.12.06 |