▶실버1
문제
풀이
먼저 행렬 A와 B를 입력받고, 같은 위치에 있는 A와 B의 요소가 다른지 확인한다.
새로운 2차원 배열 C를 생성하고 두 수가 다르다면 1, 같다면 0을 C에 넣는다.
C의 요소를 모두 탐색하면서 C의 요소가 1이라면 그 주변의 3 X 3 행렬을 모두 토글하고 다시 탐색한다.
전부 탐색을 했다면 C 행렬의 요소가 모두 0일 경우에만 정답을 출력하고, 나머지 경우에는 -1을 출력한다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <map>
using namespace std;
string a[51];
string b[51];
//a와 b의 차이 유무를 나타내는 행렬
int c[51][51];
int main(void) {
ios::sync_with_stdio(NULL);
cin.tie(0); cout.tie(0);
int n, m;
cin >> n >> m;
//행렬 a 입력
for (int i = 0; i < n; i++) {
cin >> a[i];
}
//행렬 b 입력과 동시에 같은 위치의 a 요소와 다른지 비교하여 c 행렬에 넣는다.
for (int i = 0; i < n; i++) {
cin >> b[i];
for (int j = 0; j < m; j++) {
if (a[i][j] == b[i][j]) {
c[i][j] = 0;
}
else {
c[i][j] = 1;
}
}
}
int ans = 0;
//행렬 c의 요소를 모두 탐색한다.
for (int i = 0; i < n - 2; i++) {
for (int j = 0; j < m - 2; j++) {
if (c[i][j] == 0) { continue; }
//행렬 c의 요소가 1이라면 해당 요소의 행 + 2, 열 + 2를 모두 토글한다.
else{
//횟수 하나 증가
ans++;
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 3; y++) {
if (c[i + x][j + y] == 1) {
c[i + x][j + y] = 0;
}
else {
c[i + x][j + y] = 1;
}
}
}
}
}
}
//탐색을 종료한 후, 행렬 c의 값에 1이 있다면 -1 출력
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (c[i][j] == 1) {
cout << "-1" << endl;
return 0;
}
}
}
//없다면 답 출력
cout << ans << endl;
return 0;
}
'Algorithm > Baekjoon' 카테고리의 다른 글
2477_참외밭 (2) | 2023.03.12 |
---|---|
1339_단어 수학 (0) | 2023.03.08 |
1213_팰린드롬 만들기 (0) | 2023.03.05 |
1965_상자넣기 (0) | 2023.03.03 |
1789_수들의 합 (0) | 2023.03.02 |