본문 바로가기
Algorithm/Baekjoon

1080_행렬

by 모너아링 2023. 3. 7.

▶실버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