728x90
https://www.acmicpc.net/problem/1080
문제풀이
단순하게 입력받은 행렬들을 서로 비교해서 다르면 3x3 단위로 1과 0을 뒤집어주면 되는 문제였다.
값을 바꿔준 뒤에 다르면 단순하게 -1을 출력해주면 된다.
느낀 점
오랜만에 코딩하는 것이었는데 중요한 것 두 가지를 배운 것 같다.
1. ios_base::sync_with_stdio()는 iostream와 cstdio를 동기화해주는 것!
이 문제에서 값을 입력받을 때 scanf을 썼는데 false로 두면 scanf가 정상적으로 작동하지 않기에 틀렸다고 나온다!
2. 배열에 공백 없는 숫자를 입력받을 땐 scanf("%1d", ~~)을 사용하자!
너무 어렵게 생각했는지 도저히 풀리지 않아서 고민을 많이 했는데 생각보다 간단하게 해결할 수 있는 문제였다.
시간 복잡도니 함수로 처리할 것인지 등등 먼저 생각하지 말고 간단하게 고민한 후에 틀을 대충이라도 잡고 자세한 부분은 나중에 생각하는 연습을 해봐야겠다.
코드
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
using namespace std;
int n, m;
int mat1[51][51];
int mat2[51][51];
int main() {
scanf("%d %d", &n, &m);
for (int i = 0; i < n;i++) {
for (int j = 0; j < m; j++) {
scanf("%1d", &mat1[i][j]);
}
}
for (int i = 0; i < n;i++) {
for (int j = 0; j < m; j++) {
scanf("%1d", &mat2[i][j]);
}
}
int cnt = 0;
for (int i = 0; i < n - 2;i++) {
for (int j = 0; j < m - 2;j++) {
if (mat1[i][j] != mat2[i][j]) {
for (int k = i; k <= i + 2;k++) {
for (int l = j; l <= j + 2;l++) {
mat1[k][l] = 1 - mat1[k][l];
}
}
cnt += 1;
}
else continue;
}
}
for (int i = 0; i < n;i++) {
for (int j = 0; j < m; j++) {
if (mat1[i][j] != mat2[i][j]) {
cout << "-1\n";
return 0;
}
}
}
cout << cnt << "\n";
}
'문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[C++] 백준 4358번 : 생태학 (0) | 2022.01.20 |
---|---|
[C++] 백준 11286번 : 절댓값 힙 (0) | 2022.01.18 |
[C++] 백준 11279번 : 최대 힙 (0) | 2021.11.12 |
[C++] 백준 14425번 : 문자열 집합 (0) | 2021.11.06 |
[C++] 백준 2075번 : N번째 큰 수 (0) | 2021.10.26 |
댓글