ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 1080번] 행렬 (Java 풀이)
    Algorithm/Greedy Algorithm 2022. 2. 18. 16:44

    백준알고리즘 1080번 : 행렬

     

     

    예제에서 유추할 수 있듯 3x3크기의 부분행렬을 한번에 바꾸기 때문에 그보다 작은 행렬이 문제로 나온다면

     

    다를 경우 -1, 같을 경우 0을 출력하는 것으로 판단할 수 있다.

    문제는 3x3이상의 행렬인데, 이 경우에는 부분행렬중 좌측 최상단의 값만 이용하여 비교하는 식으로했다.

    좌측 상단에서 우측 하단으로 탐색하면 언제나 좌측 최상단의 값은 해당 탐색 이후로는 변경할 수 없는 값이된다.

    이를 바탕으로 행렬 A와 행렬 B의 좌측 최상단의 값만 비교하고, 같으면 다음 탐색으로 pass,

    다르면 최상단을 포함한 3x3크기의 부분행렬을 모두 바꾸어주는 방식으로 전개한다.

    메소드를 더 다양하게 사용했더라면 코드 길이는 훨씬 줄었을 문제이다. 그래도 소요시간 자체는 오래걸리지 않았다.

     

     

    풀이 과정


    1. 2차원 배열에 행렬 A, B를 받는다.
    2. 3x3 행렬보다 행이나 열이 작은 경우에는 비교 후 0 혹은 -1을 출력하게 한다.
    3. 그 외의 경우에는 좌측 최상단의 값부터 (N-2)*(M-2) 번 만큼 탐색해준다.
    4. A, B의 좌측 최상단 값이 다른 경우 행렬 A(혹은 B)의 값을 변경해준다.(3x3, 총 9개)
    5. 변경한 횟수를 cnt하고, 최종적으로 행렬이 일치하면 cnt를, 불일치하면 -1을 출력한다.

     

     

     

     

     

    소스 ▽

    더보기
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {// No1080 : 행렬
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
    
            int[][] arr1 = new int[x][y];
            int[][] arr2 = new int[x][y];
    
            for (int i = 0; i < x; i++) {
                String[] tmp = br.readLine().split("");
                for (int j = 0; j < y; j++) {
                    arr1[i][j] = Integer.parseInt(tmp[j]);
                }
            }
            for (int i = 0; i < x; i++) {
                String[] tmp = br.readLine().split("");
                for (int j = 0; j < y; j++) {
                    arr2[i][j] = Integer.parseInt(tmp[j]);
                }
            }
    
            int ans = 0;
            if (x < 3 || y < 3) {
                stop:
                for (int i = 0; i < x; i++) {
                    for (int j = 0; j < y; j++) {
                        if (arr1[i][j] != arr2[i][j]) {
                            ans = -1;
                            break stop;
                        }
                    }
                }
                System.out.println(ans);
            } else {
                for (int i = 0; i < x - 2; i++){
                    for (int j = 0; j < y - 2; j++) {
                        if (arr1[i][j] != arr2[i][j]) {
                            int tmpX = i;
                            int tmpY = j;
                            ans++;
                            for (int k = tmpX; k < tmpX + 3; k++) {
                                for (int l = tmpY; l < tmpY + 3; l++) {
                                    arr1[k][l] = Change(arr1[k][l]);
                                }
                            }
    
                        }
                    }
                }
    
                stop2 : for (int i = 0; i < x; i++) {
                    for (int j = 0; j < y; j++) {
                        if (arr1[i][j] != arr2[i][j]) {
                            ans = -1;
                            break stop2;
                        }
                    }
                }
                System.out.println(ans);
            }
        }
    
        public static int Change(int num) {
            if (num == 0) {
                return 1;
            } else {
                return 0;
            }
    
    
        }
    }

     

     

     

     

    댓글

Designed by Tistory.