※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1080번 문제인 행렬이다.
문제는 아래 링크를 확인하자.

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

 

1080번: 행렬

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

www.acmicpc.net

다음과 같은 관찰을 통하여 문제를 해결하자.

"A의 맨 왼쪽 위칸의 숫자와 B의 맨 왼쪽 위칸의 숫자가 다르다면, 이것을 같게 하려면 어떻게 해야할까?"

"그러면 그 오른쪽 칸은? 그 칸을 확인하고 나면 그 오른쪽 칸은?"

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using namespace std;

string A[50];
string B[50];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int cnt = 0;
	int R, C; cin >> R >> C;
	for (int r = 0; r < R; r++) cin >> A[r];
	for (int r = 0; r < R; r++) cin >> B[r];
	for (int r = 2; r < R; r++) {
		for (int c = 2; c < C; c++) {
			if (A[r - 2][c - 2] != B[r - 2][c - 2]) {
				cnt++;
				for (int rr = r - 2; rr <= r; rr++) {
					for (int cc = c - 2; cc <= c; cc++) {
						if (A[rr][cc] == '0') A[rr][cc] = '1';
						else A[rr][cc] = '0';
					}
				}
			}
		}
	}

	bool chk = 1;
	for (int r = 0; r < R; r++) {
		for (int c = 0; c < C; c++) {
			if (A[r][c] != B[r][c]) chk = 0;
		}
	}

	if (chk) cout << cnt;
	else cout << -1;
}
728x90

+ Recent posts