[문제 링크]

 

1080번: 행렬

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

www.acmicpc.net


(1,1)부터 (N,M)까지 차례대로 탐색하면서 A행렬과 B행렬의 값이 일치하지 않는 위치를 발견하면 행렬을 변환하는 연산을 수행한다.

행렬 변환을 수행할 때마다 횟수를 카운팅하면서 (N,M)까지 탐색을 완료했을 때, A행렬과 B행렬이 일치하지 않는다면 불가능이므로 -1을 출력하고 일치한다면 카운팅한 횟수를 출력하면 정답을 받을 수 있다.


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

int Greedy(bool check[][50], int N, int M)
{
	int cnt = 0;
	for(int i=0; i<N-2; i++)
		for (int j = 0; j < M-2; j++)
			if (!check[i][j])
			{
				for (int k = 0; k < 3; k++)
					for (int l = 0; l < 3; l++)
						check[i + k][j + l] = !check[i + k][j + l];
				cnt++;
			}

	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
			if (!check[i][j])
				return -1;

	return cnt;
}

int main(void)
{
	int N, M;
	cin >> N >> M;

	bool check[50][50];
	string A[50], B[50];

	for (int i = 0; i < N; i++)
		cin >> A[i];

	for(int i=0; i<N; i++)
		cin >> B[i];

	for(int i=0; i<N; i++)
		for (int j = 0; j < M; j++)
		{
			if (A[i][j] == B[i][j])
				check[i][j] = true;
			else
				check[i][j] = false;
		}

	cout << Greedy(check, N, M) << endl;

	return 0;
}

알고리즘 200일 프로젝트 - 114 day

'알고리즘 > BOJ' 카테고리의 다른 글

백준 1138번: 한 줄로 서기  (0) 2020.08.02
백준 2352번: 반도체 설계  (0) 2020.07.30
백준 16637번: 괄호 추가하기  (0) 2020.07.29
백준 2529번: 부등호  (0) 2020.07.29
백준 1049번: 기타줄  (0) 2020.07.28

+ Recent posts