BOJ

백준 1080 - 행렬

yanJuicy 2020. 3. 22. 21:08
반응형

문제

 

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

 

1080번: 행렬

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

www.acmicpc.net

 

 

풀이

 

a행렬과 b행렬을 만들어서 a행렬의 각 요소를 b행렬과 비교한다. 만약 다를 경우, 그 위치에서 3x3만큼 a행렬의 값들을 뒤집어주면된다. 마지막으로 뒤집은 후 b 행렬과 비교해서 같은지 다른지 확인하면 된다. 행렬을 뒤집어주는 연산은 a행렬의 특정 위치 이후로 3x3의 부분행렬이 존재해야 하므로 a행렬의 모든 값에 대해 비교를 진행할 수 없다. 행 방향으로 N-2번 가능하고, 열 방향으로 M-2번 가능하다.

 

 

코드

 

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
#include <iostream>
 
using namespace std;
 
int N, M;
char a[50][50], b[50][50];
int result;
 
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';
        }
    }
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
 
    cin >> N >> M;
 
    for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
            cin >> a[i][j];
    
    for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
            cin >> b[i][j];
 
    for (int i = 0; i < N - 2; i++)
    {
        for (int j = 0; j < M - 2; j++)
        {
            if (a[i][j] != b[i][j])
            {
                change(i, j);
                result++;
            }
        }
    }
 
    bool isDifferent = false;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            if (a[i][j] != b[i][j])
            {
                isDifferent = true;
            }
        }
    }
 
    if (isDifferent) cout << -1;
    else cout << result;
 
    return 0;
}
cs

 

 

 

반응형

'BOJ' 카테고리의 다른 글

백준 1107 - 리모컨  (0) 2020.03.24
백준 1780 - 종이의 개수  (0) 2020.03.23
백준 1377 - 버블 소트  (0) 2020.03.10
백준 6064 - 카잉 달력  (0) 2020.03.09
백준 1783 - 병든 나이트  (0) 2020.03.06