정수로 이루어진 M x N 행렬 데이터가 있다고 하자
행렬의 원소 중에 0이 있을 경우 해당 원소가 위치하는 행,열 전체 데이터를 0으로 변경하는 코드를 작성하라.
제로베이스 문제 풀이에서는 다르게 풀었지만 boolean써가면서 푸는게 이해가 잘 안되서 그냥 내 식대로 풀어봤다.
import java.util.*;
import java.util.stream.IntStream;
class Main {
public static void main(String[] args) {
int[][] matrix = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
solution(matrix);
System.out.println();
matrix = new int[][]{{1,1,0},{1,1,1},{0,1,1}};
solution(matrix);
}
public static void solution(int[][] matrix) {
HashSet<Integer> x = new HashSet<>();
HashSet<Integer> y = new HashSet<>();
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] == 0) {
y.add(i);
x.add(j);
}
}
}
for (Integer i : x) {
IntStream.range(0,matrix[0].length).forEach(i1->matrix[i1][i]=0);
}
for (Integer i : y) {
IntStream.range(0,matrix.length).forEach(i1->matrix[i][i1]=0);
}
for (int[] ints : matrix) {
for (int anInt : ints) {
System.out.print(anInt+" ");
}
System.out.println();
}
}
}
어떻게 풀었냐면
1. 우선 0이 들어가있는 좌표를 구한다.
2. 구한 좌표를 Set에 넣어서 중복값을 제거해준다.
3. 행 Set에 들어있는 값을 기준으로 열 모두를 0으로, 열 Set을 기준으로 행 모두를 0으로 변경
Set을 통해 중복값을 제거 해준 이유는 예를 들어 아래와 같은 행렬 데이터가 있다고 생각해보자
1 | 1 | 0 |
1 | 1 | 1 |
1 | 1 | 0 |
0이 arr[0,2] 와 arr[2,2]에 위치해있다.
둘은 열의 위치가 똑같으므로 행 위치를 둘다 기억해서 행을 쭉 0으로 , 열은 둘중 하나만 값이 존재해도 되니 하나가지고 쭉 0으로 만들어주면된다.(바껴야할 행이 2개,열은 1개)
'TIL' 카테고리의 다른 글
백준 1874번 : 스택 수열 (0) | 2022.04.07 |
---|---|
백준 3190 : 뱀 (0) | 2022.04.07 |
파스칼의 삼각형 (0) | 2022.04.01 |
컬렉션에서 중복값 찾아내기 (0) | 2022.03.30 |
원시값 배열을 Stream을 이용해서 리스트로 바꾸기 (0) | 2022.03.30 |
댓글