ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [1080] 행렬
    BOJ 2021. 10. 3. 13:29

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

     

    1080번: 행렬

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

    www.acmicpc.net

    <문제>

    3*3씩 토글할때, 왼쪽 위를 기준점으로 잡는다고 생각해보자.

    가능한 기준점의 위치는 R : [0, n-2], C : [0, m-2]이다.

    어처피 하나의 칸의 버튼을 2번이상 누를 필요는 없으므로, 버튼을 누르거나, 안누르거나 둘중에 하나를 선택해야한다.

    다만 기준점이 바뀔 수 있는 타이밍은, 기준점을 토글할때 뿐이므로

    버튼을 눌러야 하는가에 대한 판별은, 기준점의 원소가 행렬 B와 다른지로 판별이 가능하다.

    이는 아래 코드의 30라인에서 확인 할 수 있다.

    <소스코드>

    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
    #include <bits/stdc++.h>
    using namespace std;
    int n, m, a[51][51], b[51][51];
    void toggle(int y, int x) {
        for (int i = y; i <= y + 2; i++) {
            for (int j = x; j <= x + 2; j++) {
                a[i][j] = 1 - a[i][j];
            }
        }
    }
    int main(void) {
        cin >> n >> m;
        int i, j;
        string s;
        for (i = 0; i < n; i++) {
            cin >> s;
            for (j = 0; j < m; j++) {
                a[i][j] = s[j] - '0';
            }
        }
        for (i = 0; i < n; i++) {
            cin >> s;
            for (j = 0; j < m; j++) {
                b[i][j] = s[j] - '0';
            }
        }
        int answer = 0;
        for (i = 0; i < n - 2; i++) {
            for (j = 0; j < m - 2; j++) {
                if (a[i][j] != b[i][j]) {
                    toggle(i, j);
                    answer++;
                }
            }
        }
        bool flag = true;
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                if (a[i][j] != b[i][j]) {
                    flag = false;
                }
            }
        }
        if (flag == true)
            cout << answer;
        else if (flag == false)
            cout << "-1";
        return 0;
    }
    cs

     

    'BOJ' 카테고리의 다른 글

    [1449] 수리공 항승  (0) 2021.10.04
    [16953] A → B  (0) 2021.10.04
    [1744] 수 묶기  (0) 2021.10.03
    [1059] 좋은 구간  (0) 2021.10.03
    [20056] 마법사 상어와 파이어볼  (0) 2021.10.02

    댓글