티스토리 뷰

알고리즘

백준 1080

kOsari 2023. 6. 26. 14:46

1080번: 행렬 (acmicpc.net)

 

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 ;
            }
        }
    }


}

'알고리즘' 카테고리의 다른 글

백준 2553  (0) 2023.07.01
백준 2346번  (0) 2023.06.26
백준 1052  (0) 2023.06.26
백준 1475  (0) 2023.06.23
백준 2697번  (0) 2023.06.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함