본문 바로가기
Algorithm/BOJ

[BOJ]1080번: 행렬 (c++)

by HBGB 2020. 6. 20.

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

 

1080번: 행렬

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

www.acmicpc.net

 

그리디

#include <iostream>
#include <vector>

using namespace std;

void reverse(vector<string> &v, int x, int y)
{
	for (int i = x; i < x + 3; ++i)
	{
		for (int j = y; j < y + 3; ++j)
		{
			if (v[i][j] == '0')
			{
				v[i][j] = '1';
			}
			else
			{
				v[i][j] = '0';
			}
		}
	}
}

bool check(vector<string> &from, vector<string> &to)
{
	int N = from.size();
	int M = from[0].size();
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < M; ++j)
		{
			if (from[i][j] != to[i][j])
			{
				return false;
			}
		}
	}
	return true;
}

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

	// 입력
	int N, M;
	cin >> N >> M;
	vector<string> from(N), to(N);
	for (int i = 0; i < N; ++i)
	{
		cin >> from[i];
	}
	for (int i = 0; i < N; ++i)
	{
		cin >> to[i];
	}

	/*
		3 * 3 크기의 변환이 가능한 영역에서 맨위, 왼쪽에서부터 검사
		from[i][j]와 to[i][j]가 다르다면
		from[i][j]를 시작으로 하는 3 * 3영역을 뒤집어 주어야 한다.
	*/
	int cnt = 0;
	for (int i = 0; i <= N - 3; ++i)
	{
		for (int j = 0; j <= M - 3; ++j)
		{
			if (from[i][j] != to[i][j])
			{
				reverse(from, i, j);
				++cnt;
			}
		}
	}

	// 두 행렬이 같지 않으면 : 바꿀 수 없는 경우
	if (!check(from, to))
	{
		cnt = -1;
	}

	cout << cnt;

	return 0;
}

 

 

N 과 M이 3보다 작은 경우를 생각해주어야 한다!!!

반례)

// 답 -1
2 2
00
00
11
11


// 답 0
2 2
00
00
00
00

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ]1285번: 동전 뒤집기 (c++)  (0) 2020.06.25
[BOJ]2138번: 전구와 스위치 (c++)  (0) 2020.06.24
[BOJ]11399번: ATM (c++)  (0) 2020.06.20
[BOJ]1931번: 회의실배정 (c++)  (0) 2020.06.20
[BOJ] 11047번: 동전 0 (c++)  (0) 2020.06.17

댓글