#문제
m * n 크기의 Ineteger matrix가 주어졌을 때, 엘레먼트가 0이라면 그 행과 그 열을 모두 0으로 변경하여라.
문제에서 주어진 공간 안에서 다른 추가 공간을 사용하지 않고 풀어야 한다.
# 1차 풀이
class Solution {
public void setZeroes(int[][] matrix) {
//0인 요소를 찾기
int row = matrix.length;
int column = matrix[0].length;
List<Integer> targetRow = new ArrayList<>();
List<Integer> targetColumn = new ArrayList<>();
for(int x = 0; x<row; x++) {
for(int y = 0; y<column; y++) {
if(matrix[x][y] == 0) {
targetRow.add(x);
targetColumn.add(y);
}
}
}
//행을 반복하면서 0으로 치환
for(var targetColumnNum : targetColumn){
for(int x=0; x<row; x++) {
matrix[x][targetColumnNum.intValue()] = 0;
}
}
//열을 반복하면서 0으로 치환
for(var targetRowNum : targetRow){
for(int y=0; y<column; y++) {
matrix[targetRowNum.intValue()][y] = 0;
}
}
}
}
# 2차 풀이
class Solution {
public void setZeroes(int[][] matrix) {
int row = matrix.length;
int column = matrix[0].length;
boolean rowZero = false;
//0행과 0열에 0인 요소들을 표시
for(int x = 0; x<row; x++) {
for(int y = 0; y<column; y++) {
if(matrix[x][y] == 0) {
matrix[0][y]=0;
if(x>0)
matrix[x][0]=0;
else
rowZero=true; // [x, 0]좌표의 값의 요소가 0인 경우는 rowZero로 표시
// x의 범위는 1 ~ 2이상의 수
}
}
}
//0표시한 열과 행을 기준으로 [1,1] 좌표부터 해당되는 열과 행의 값을 0으로 치환
for(int x=1;x<row;x++) {
for(int y=1;y<column;y++) {
if(matrix[0][y]==0 || matrix[x][0]==0)
matrix[x][y]=0;
}
}
if(matrix[0][0]==0) //0~row 번째의 행을 0으로 치환
{
for(int x=0;x<row;x++)
matrix[x][0]=0;
}
if(rowZero==true) //0~column 번째의 열을 0으로 치환
{
for(int y=0;y<column;y++)
matrix[0][y]=0;
}
}
}
# 참조