티스토리 뷰
1080번: 행렬
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
www.acmicpc.net
문제이해
해당 문제의 경우 처음에는 3*3이 아니라 1열을 통째로 바꾸는 것으로 이해하고 그렇게 문제를 해결 했더니 실패 했다.
하지만 해당 문제의 경우 3*3의 행렬만 교체 하는 것이다.
여기서 중요한 것은 변경을 최소화 하는 것이다.
해당 문제에서 변경을 최소화 하기 위해선 왼쪽 위부터 반복한다면 변경을 최소화 할 수 있다.
문제풀이
모든 값들을 입력받고
왼쪽 위부터 시작해 비교해서 변경이 필요하면 변경한다.
마지막에 A와 B가 동일한지 확인하고 동일하면 변경횟수를 출력 아니면 -1을 출력하면된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class test37 {
public static int[][] A;
public static int[][] B;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int row = sc.nextInt();
int col = sc.nextInt();
A = new int [row][col];
B = new int [row][col];
//처음 지도
for(int i = 0 ; i <row; i ++) {
String str = sc.next();
for(int j = 0 ; j < col ; j++)
A[i][j] = Integer.parseInt(str.substring(j,j+1));
}
//변경할 지도
for(int i = 0 ; i <row; i ++) {
String str = sc.next();
for(int j = 0 ; j < col ; j++)
B[i][j] = Integer.parseInt(str.substring(j,j+1));
}
int cnt = 0;
//탐색 시작(배열 범위 넘어가지않게 row-2 , col-2 까지만 돌림
for(int i = 0 ; i < row-2; i++) {
for(int j = 0 ; j < col-2; j++) {
//동일하지 않을 경우 뒤집음
if(A[i][j] != B[i][j]) {
change(i,j);
cnt++;
}
}
}
//A,B배열이 같은지 확인
int flag = 0;
for(int i = 0 ; i < row ; i++) {
for(int j = 0 ; j < col ; j++) {
if(A[i][j] == B[i][j]){
flag ++;
}
}
}
if(flag == row*col)
System.out.println(cnt);
else
System.out.println(-1);
}
//i,j 기준으로 3*3 크기만큼 비트 뒤집기
public static void change(int x , int y) {
for(int i = x ; i <x+3 ; i++) {
for(int j = y; j<y+3 ; j++) {
A[i][j] = A[i][j] ^ 1 ;
}
}
}
}