문제 풀이/백준

[백준] 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[][] 배열을 사용하였다.