본문 바로가기
코딩테스트_백준풀이

행렬 #1080 c++ 풀이

by wanna_dev 2023. 11. 22.

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

 

1080번: 행렬

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

www.acmicpc.net

 

내가좋아하는 행렬 문제 근데, 왜 Greedy알고리즘인지 모르고 풀었다.

검사해서 3개씩 바꿀건데 바꾸기전과 바꾼후가 다르면 결국 변환시킬수 없는 것이다.

따라서, 우선 변환시키고 다르면, 변환했을때를 비교해서 검사했다.

	#include<iostream>

	using namespace std;
	int arr[51][51];
	int answer[51][51];
	int N, M;
	int cnt; 
	void change(int y, int x) {
		cnt++;
		for (int i = y; i < y + 3; i++) {
			for (int j = x; j < x + 3; j++) {
				if (arr[i][j] == 1)
					arr[i][j] = 0;
				else
					arr[i][j] = 1;
			}
		}
	}

	int main() {

	

		cin >> N >> M;
		
		
		string a;
		for (int i = 0; i < N; i++) {
			cin >> a;
			for (int j = 0; j < a.size(); j++) {
				arr[i][j] = a[j]-'0';
			}
		}
		for (int i = 0; i < N; i++) {
			cin >> a;
			for (int j = 0; j < a.size(); j++) {
				answer[i][j] = a[j]-'0';
			}
		}
	
		for (int i = 0; i < N-2; i++) {
			for (int j = 0; j < M-2; j++) {
				if (arr[i][j] != answer[i][j]) {
					change(i, j);
				}
				//if (arr[i][j] != answer[i][j]) {
				//	cout << -1 << endl;
				//}
			}
		}
		for (int i = 0; i < N ; i++) {
			for (int j = 0; j < M ; j++) {
				if (arr[i][j] != answer[i][j]) {
					cout << -1 << endl;
					return 0;
				}
				//if (arr[i][j] != answer[i][j]) {
				//	cout << -1 << endl;
				//}
			}
		}
		

		cout << cnt << endl;
		return 0;
	}

'코딩테스트_백준풀이' 카테고리의 다른 글

강의실 배정 #11000  (1) 2023.11.23
로프 #2217 c++ 풀이  (0) 2023.11.22
신입사원 #1946 c++ 풀이  (2) 2023.11.22
잃어버린 괄호 #1541 c++ 문제풀이  (0) 2023.11.22
주짓수 #15724 c++ 풀이  (1) 2023.11.20