문제 풀이/백준
[백준] 1080번. 행렬(JAVA)
27200
2025. 2. 13. 16:23
문제
https://www.acmicpc.net/problem/1080
풀이(18분)
import java.io.*;
import java.util.*;
public class Main {
static int n, m;
static boolean[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
arr = new boolean[n][m]; // 0이면 true, 1이면 false
boolean[][] target = new boolean[n][m];
for(int i = 0; i < n; i++){
String line = br.readLine();
for(int j = 0; j < m; j++){
if(line.charAt(j) == '0'){
arr[i][j] = true;
}
} // arr 배열 저장
}
for(int i = 0; i < n; i++){
String line = br.readLine();
for(int j = 0; j < m; j++){
if(line.charAt(j) == '0'){
target[i][j] = true;
}
}
} // target 배열 저장
int answer = 0;
for(int i = 0; i <= n - 3; i++){
for(int j = 0; j <= m - 3; j++){
if(arr[i][j] != target[i][j]){ // 다르다면 3,3 사이즈 교체
change(i, j);
answer++;
}
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(arr[i][j] != target[i][j]){ // 최종 완성이 되었는지 테스트
System.out.println(-1);
return;
}
}
}
System.out.println(answer);
}
static void change(int row, int col){ // 배열을 변환해주는 메서드
for(int i = row; i < row + 3; i++){
for(int j = col; j < col + 3; j++){
if(arr[i][j]){
arr[i][j] = false;
continue;
}
arr[i][j] = true;
}
}
}
}
0과 1을 3x3 만큼 계속 변경해줘야 하는 문제였다.
n과 m이 최대 50이라는 사이즈 제한이 있기 때문에 슬라이딩 윈도우의 느낌으로 3x3의 좌상단 하나만 체크하여 쭉 변경하는 것을 목표로 했다.
최종적으로 완성되었는지 테스트를 진행하고, 하나라도 완성이 안 되었다면 변환에 실패한 것이기 때문에 -1을 리턴하고 종료한다.
0과 1만을 사용하기 굳이 int[][]을 사용하지 않고, boolean[][] 배열을 사용하였다.