아이디어
A[i][j] 와 B[i][j] 가 다르다면 원소를 뒤집는 작업을 해야한다.
(0, 0) 부터 순회하며 A[i][j] 와 B[i][j] 가 다르면 A 의 원소를 뒤집는 작업을 하되 (i, j) 를 뒤집을 때 이전에 뒤집어서 맞춰놓은 곳에는 영향을 미치면 안 되기 때문에 (i, j) 가 3 x 3 부분 행렬의 첫 번째가 되도록 한다.
즉 (i, j) ~ (i + 2, j + 2) 까지 뒤집어야 하는데 3 x 3 의 범위가 원본 행렬의 범위를 넘어가면 뒤집을 수 없다.
풀이코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[][] A;
static int[][] B;
static int N;
static int M;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
A = new int[N][M];
for (int i = 0; i < N; i++) {
String temp = br.readLine();
for (int j = 0; j < M; j++) {
A[i][j] = temp.charAt(j) - '0';
}
}
B = new int[N][M];
for (int i = 0; i < N; i++) {
String temp = br.readLine();
for (int j = 0; j < M; j++) {
B[i][j] = temp.charAt(j) - '0';
}
}
int cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (A[i][j] != B[i][j]) {
flip(i, j);
cnt++;
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (A[i][j] != B[i][j]) {
cnt = -1;
break;
}
}
}
System.out.println(cnt);
}
public static void flip(int i, int j) {
if (i + 2 >= N || j + 2 >= M) return;
for (int k = i; k < i + 3; k++) {
for (int l = j; l < j + 3; l++) {
A[k][l] = (A[k][l] + 1) % 2;
}
}
}
}
'Algorithm > 백준 알고리즘' 카테고리의 다른 글
20152번. Game Addiction (1) | 2023.11.01 |
---|---|
16401번. 과자 나눠주기 (0) | 2023.11.01 |
2876번. 그래픽스 퀴즈 (1) | 2023.11.01 |
3085번. 사탕 게임 (0) | 2023.11.01 |
1455번. 뒤집기 Ⅱ (0) | 2023.11.01 |