본문 바로가기
TIL

MxN 행렬 데이터의 특정 원소의 행,열 모두를 변경하기

by 도쿠니 2022. 4. 6.

정수로 이루어진 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

댓글