본문 바로가기
문제 풀이/백준(BOJ)

[C++] 백준 1080번 : 행렬

by 희조당 2022. 1. 17.
728x90

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

 

1080번: 행렬

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

www.acmicpc.net


 문제풀이

단순하게 입력받은 행렬들을 서로 비교해서 다르면 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";
}

댓글