알고리즘
백준 1080번 행렬 (JAVA)
박카스마시며코딩
2023. 9. 13. 21:39
https://www.acmicpc.net/problem/1080
1080번: 행렬
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
www.acmicpc.net
저는 그리디를 통해 문제를 해결하였습니다.
해당 값이 다르다면 3x3 행렬 변경하고 그렇지 않다면 변경하지 않는 것입니다.
그 다음 변경할 수 없는 곳 에서 값이 다르다면 바로 -1를 리턴하였습니다.
예를 들어 해당 값을 변경하면 해당 좌표로 부터 3을 더했을 때 경계값을 벗어나게 되는 곳이 값이 다르다면 바로 -1을 리턴하여 문제를 해결하였습니다.
package BOJ.etc;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_1080 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Function<String,Integer> stoi =Integer::parseInt;
StringTokenizer st = new StringTokenizer(br.readLine());
int n = stoi.apply(st.nextToken());
int m = stoi.apply(st.nextToken());
int[][][] arr = new int[2][n][m];
for(int i = 0 ; i < 2 ; i++){
for(int j = 0 ; j < n ; j++){
String command = br.readLine();
for(int k = 0 ; k < m ; k++){
arr[i][j][k] = stoi.apply(command.charAt(k)+"");
}
}
}
int result = cal(0,0,arr,n,m);
if(result == INF){
System.out.println(NOT_FOUND);
}else{
System.out.println(result);
}
}
private static final int SIZE = 3;
private static final int NOT_FOUND = -1;
private static final int INF = 987654321;
private static int cal(int y, int x, int[][][] arr, int n, int m) {
int cnt = 0;
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < m ; j++){
if(arr[0][i][j] != arr[1][i][j]){
if(i + SIZE > n || j + SIZE > m){
return NOT_FOUND;
}
change(i,j,arr);
cnt++;
}
}
}
return cnt;
}
private static void change(int y, int x, int[][][] arr) {
for(int i = 0 ; i < SIZE ; i++){
for(int j = 0 ; j < SIZE ; j++){
arr[0][y+i][x+j] = (arr[0][y+i][x+j] + 1) % 2;
}
}
}
private static boolean isSame(int[][][] arr, int n, int m) {
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < m ; j++){
if(arr[0][i][j] != arr[1][i][j]){
return false;
}
}
}
return true;
}
}