[BOJ] 1080 행렬

1080번: 행렬 (acmicpc.net)

이 문제가 왜 그리디인지를 생각하면 쉽게 풀 수 있다.
3*3 의 부분행렬이라는 조건이 주어졌기 때문에 (0,0) 을 기점으로 3*3 행렬을 뒤집는 식으로 문제를 풀었다.

배열1의 값과 배열2의 값이 다르면, 3*3 행렬을 뒤집는다.
뒤집을 때 마다 카운트 변수를 증가시키고, 최종적으로 두 배열을 비교한다.
작업을 모두 수행했는데 두 배열이 같지 않은 경우 카운트 변수를 -1로 설정한다.
배열이 같은 경우는 그대로 저장된 카운트 변수를 출력한다.

package com.algo.boj;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ1080Matrix {
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st= new StringTokenizer(br.readLine());
		int r = Integer.parseInt(st.nextToken());
		int c = Integer.parseInt(st.nextToken());
		char[][] arr1 = new char[r][c];
		char[][] arr2 = new char[r][c];
		for (int i = 0; i < r; i++) {
			arr1[i] = br.readLine().toCharArray();
		}
		for (int i = 0; i < r; i++) {
			arr2[i] = br.readLine().toCharArray();
		}
		int count = 0;

		for (int i = 0; i < r-3; i++) {
			for (int j = 0; j < c-3; j++) {
				if(arr1[i][j]!=arr2[i][j]) {
					count++;
					for (int k = 0; k < 3; k++) {
						for (int l = 0; l< 3; l++) {
							if(arr1[i+k][j+l]=='1') 
								arr1[i+k][j+l]='0';
							else 
								arr1[i+k][j+l]='1';
						}

					}
				}

			}

		}
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				if(arr1[i][j]!=arr2[i][j]) { 
					count=-1;
					break;
				}
			}
		}
		System.out.print(count);

	}

}