반응형
문제
https://www.acmicpc.net/problem/1080
풀이
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 |