본문으로 바로가기

[백준] 1080번 : 행렬

category 알고리즘/백준 2021. 11. 24. 21:49
728x90

 

https://www.acmicpc.net/problem/1080

 

1080번: 행렬

첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.

www.acmicpc.net

 

문제

 

0과 1로만 이루어진 행렬 A와 행렬 B가 있다. 이때, 행렬 A를 행렬 B로 바꾸는데 필요한 연산의 횟수의 최솟값을 구하는 프로그램을 작성하시오.

행렬을 변환하는 연산은 어떤 3×3크기의 부분 행렬에 있는 모든 원소를 뒤집는 것이다. (0 → 1, 1 → 0)

 

입력

 

첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.

 

출력

 

첫째 줄에 문제의 정답을 출력한다. 만약 A를 B로 바꿀 수 없다면 -1을 출력한다.

 

 

풀이 방법

 

문자열을 입력받아 이를 int의 값에 대입하기 위해 charAt()으로 문자열을 잘라
문자로 만든 후 -'0'의 과정을 거쳐 저장하였다.
이후, 범위값 내에서 3x3을 여러번 반복하여 사용하므로 따로 함수로 만들었고,
change 함수가 반복되는 수만큼 count를 증가시켜 값을 구하였고,
변화가 되지 않으면 즉, a를 b로 바꿀 수 없다면 -1 출력 후
return 하여 문제를 해결하였다.

 

작성 코드

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package baekjoon.greedy;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class BJ_1080 {
 
    static int a[][];
    static int b[][];
 
    public static void main(String[] args) throws IOException {
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        a = new int[N][M];
        b = new int[N][M];
        int count = 0;
 
        for (int i = 0; i < N; i++) {
            String s = br.readLine();
            for (int j = 0; j < s.length(); j++) {
                a[i][j] = s.charAt(j) - '0';
            }
        }
 
        for (int i = 0; i < N; i++) {
            String s = br.readLine();
            for (int j = 0; j < s.length(); j++) {
                b[i][j] = s.charAt(j) - '0';
            }
        }
 
 
        for (int i = 0; i <= N - 3; i++) {
            for (int j = 0; j <= M - 3; j++) {
                if (a[i][j] != b[i][j]) {
                    change(i, j);
                    count++;
                }
            }
        }
 
        for(int i=0;i<N;i++){
            for (int j=0;j<M;j++){
                if(a[i][j]!=b[i][j]){
                    System.out.println(-1);
                    return;
                }
            }
        }
        System.out.println(count);
    }
 
    public static void change(int x, int y) {
 
        for (int i = x; i < x + 3; i++) {
            for (int j = y; j < y + 3; j++) {
                if (a[i][j] == 1) {
                    a[i][j] = 0;
                } else {
                    a[i][j] = 1;
                }
            }
        }
    }
}
 
 
 

 

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2178번 : 미로 탐색  (0) 2021.11.25
[백준] 1260번 : DFS와 BFS  (0) 2021.11.25
[백준] 16953번 : A -> B  (0) 2021.11.24
[백준] 1744번 : 수 묶기  (0) 2021.11.23
[백준] 1439번 : 뒤집기  (0) 2021.11.23