Algorithm/백준 알고리즘

백준_1080 행렬(자바) / 그리디 알고리즘

미스터로즈 2021. 8. 13. 09:44

시간&메모리 제한

 

문제

 

입력&출력

 

문제

package com.Back;

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

public class Back_1080 {

	static int ori[][];
	static int cha[][];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());

		ori = new int[N][M];
		cha = new int[N][M];

		for (int i = 0; i < N; i++) {
			String tmp=br.readLine();
			for (int j = 0; j < M; j++) {
				ori[i][j] = tmp.charAt(j)-'0';
			}
		}
		for (int i = 0; i < N; i++) {
			String tmp=br.readLine();
			for (int j = 0; j < M; j++) {
				cha[i][j] = tmp.charAt(j)-'0';
			}
		}

		int ans = 0;
		for (int i = 0; i < N - 2; i++) {
			for (int j = 0; j < M - 2; j++) {
				if (ori[i][j] != cha[i][j]) {
					ans++;
					change(i, j);
				}
			}
		}
		boolean flag = false;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if (ori[i][j] != cha[i][j]) {
					System.out.println(-1);
					flag = true;
					break;
				}
			}
			if (flag == true)
				break;
		}
		if (flag == false) {
			System.out.println(ans);
		}
	}

	private static void change(int x, int y) {
		for (int i = x; i <= x + 2; i++) {
			for (int j = y; j <= y + 2; j++) {
				ori[i][j] = 1 - ori[i][j];
			}
		}
	}
}
이 문제는 그리디 알고리즘을 활용하는 문제입니다.
문제에 대한 해결 방법은 각 요소 별로 접근해서 다르다면 범위의 행렬을 모두 바꿔주면 됩니다.
순차적으로 진행했을 때, 원하는 배열의 형태가 아니면 -1을 출력하고 종료합니다.
원하는 배열의 형태인 경우에는 배열을 몇 번 바꿨는지 값을 출력해주면 됩니다.