Dev.baelanche

[백준 1080] 행렬 본문

Data Structure & Algorithm/PS - JAVA

[백준 1080] 행렬

baelanche 2019. 6. 4. 21:06
반응형

 

감이 안와서 질문게시판을 참고했다.

 

1. 행렬 A, B 를 비교한 정보를 담은 배열 C를 만든다. (일치하면 false, 불일치하면 true 로 진행했다.)

2. 0, 0 부터 n-3, m-3 까지 3*3 크기로 탐색한다.

- 탐색이 끝났을때 C의 각 배열 정보가 모두 일치해야 문제의 조건을 만족한다.

2-1. 탐색할때 첫번째 인덱스가 false(일치)라면 원소 값을 뒤집을 필요 없다.

 

 

글로만 쓰자니 힘들어서 주석을 달아놓았다.

 

 

public class Main {
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        char a[][] = new char[n][m];
        boolean b[][] = new boolean[n][m]; //A, B를 비교한 정보를 담은 배열
        
        for(int i=0; i<n; i++) {
            st = new StringTokenizer(br.readLine());
            a[i] = st.nextToken().toCharArray();
        }
        
        boolean d = true;
        for(int i=0; i<n; i++) {
            st = new StringTokenizer(br.readLine());
            char temp[] = st.nextToken().toCharArray();
            for(int j=0; j<m; j++) {
                if(a[i][j] != temp[j]) {
                    b[i][j] = true;
                    d = false;
                }
                else b[i][j] = false;
            }
        }
        
        //A, B가 모두 일치했을때 0출력
        if(d) System.out.println(0);
        else {
       		//3*3보다 작을때
            if(n < 3 || m < 3) System.out.println(-1);
            else {
                int cnt = 0;
                for(int i=0; i<=n-3; i++) {
                    for(int j=0; j<=m-3; j++) {
                    	//b[i][j] 가 true(불일치)이면 change를 진행한다
                        if(b[i][j]) {
                            change(b, i, j);
                            cnt++;
                        }
                    }
                }
                
                for(int i=0; i<n; i++) {
                    for(int j=0; j<m; j++) {
                        if(b[i][j]) {
                            System.out.println(-1);
                            return;
                        }
                    }
                }
                System.out.println(cnt);
            }
        }
    }
    
    public static void change(boolean b[][], int x, int y) {
        for(int i=x; i<x+3; i++) {
            for(int j=y; j<y+3; j++) {
                b[i][j] = !b[i][j];
            }
        }
    }
}

 

 

n, m 이 3보다 작을때와 배열이 처음부터 일치할때만 신경써주면 된다.

반응형

'Data Structure & Algorithm > PS - JAVA' 카테고리의 다른 글

[백준 2108] 통계학  (0) 2019.06.08
[백준 9020] 골드바흐의 추측  (0) 2019.06.08
[백준 1541] 잃어버린 괄호  (0) 2019.06.03
[백준 1049] 기타줄  (0) 2019.05.31
[백준 1946] 신입 사원  (0) 2019.05.31
Comments