문제

접근법
- 3*3 으로 탐색한다.
- 부분 행렬에 있는 모든원소를 뒤집는다. -> 모든 원소를 뒤집는 메서드change
- 변환이 끝난 A,B 두 행렬이 동일한지 확인하여 -1 또는 연산 횟수를 출력.
코드
public class Main_1052 {
  static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  public static void main(String[] args) throws IOException{
    StringTokenizer token = new StringTokenizer(br.readLine());
    int N = Integer.parseInt(token.nextToken());
    int M = Integer.parseInt(token.nextToken());
    int[][] A = new int[N][M];
    int[][] B = new int[N][M];
    // A,B 행렬에 값 넣기
    procession(A, N, M);
    procession(B, N, M);
    int count = 0;
    // 접근법 1. 3*3 으로 탐색
    for(int i = 0; i<=N-3; i++) {
      for(int k=0; k<=M-3; k++) {
        if(A[i][k] != B[i][k]) {
            // 행렬의 원소가 같은지 확인 후 change 호출
          change(A, i, k);
          count++;
        }
      }
    }
    // 행렬 동일한지 확인
    for(int i = 0; i<N; i++) {
      for(int k =0; k<M; k++) {
        if(A[i][k] != B[i][k]) {
          System.out.println(-1+"\n");
          return;
        }
      }
    }
    System.out.println(count+"\n");
    br.close();
  }
  // 행렬에 값 넣기
  public static void procession(int[][] R, int N, int M) throws IOException {
    for(int i = 0; i<N; i++) {
      String[] tokens = br.readLine().split("");
      for(int k=0; k<M; k++) {
        R[i][k] = Integer.parseInt(tokens[k]);
      }
    }
  }
  // 접근법 2. 3*3 형식으로 행렬 뒤집기
  public static void change(int[][] A, int x, int y) {
    for(int i = x; i<x+3; i++) {
      for(int k=y; k<y+3; k++) {
        A[i][k] = 1- A[i][k];
      }
    }
  }
}Share article