DOTY

8) 백준 1080 - 행렬 본문

Algorithm/Greedy

8) 백준 1080 - 행렬

증식세포 2020. 10. 8. 18:03
728x90
반응형

<문제>

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

 

1080번: 행렬

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

www.acmicpc.net

하다가 화난 문제....ㅠㅠㅠㅠㅠ

 

<코드>

#include <iostream>

using namespace std;

int main(void) {
	int arr_A[50][50] = {0, };
	int arr_B[50][50] = {0, };
	int N, M;
	cin >> N >> M;
	
	for(int i = 0; i < N; i++) {
		for(int j = 0; j < M; j++) {
			scanf("%1d", &arr_A[i][j]);
		}
	}
	
	for(int i = 0; i < N; i++) {
		for(int j = 0; j < M; j++) {
			scanf("%1d", &arr_B[i][j]);
		}
	}
	
	int cnt = 0;
	
	for(int i = 0; i < N-2; i++) {
		for(int j = 0; j < M-2; j++) {
			if(arr_A[i][j] != arr_B[i][j]) {
				for(int k = 0; k < 3; k++){
					for(int l = 0; l < 3; l++) {
						arr_A[i+k][j+l] = 1 - arr_A[i+k][j+l];
					}	
				}
				cnt++;
			}
		}
	}
	
	for(int i = 0; i < N; i++) {
		for(int j = 0; j < M; j++) {
			if(arr_A[i][j] != arr_B[i][j]) {
				cnt = -1;
				break;
			}
		}
		if(cnt == -1) break;
	}
	
	cout << cnt << endl;
	return 0;
}

사실은 함수를 이용해서 더욱 깔끔하게 만들 수 있었던 문제.

풀이는 사실 간단하다.

3X3 크기만큼의 배열 숫자들을 0은 1로, 1은 0으로 바꾸는 문제.

배열 A의 [0][0]부터 오른쪽으로 이동하면서 3X3배열의 1행 1열의 숫자만 확인하면 된다. 맞으면 넘어가고, 틀리면 전체 다 바꾸고. 이 과정이 이중 for문이고, 숫자 확인해서 3X3크기만큼 바꿔주는 과정이 이중 for문 안의 또 다른 이중 for문(이걸 함수로 따로 처리하면 깔~~~끔)이다.

 

근데 답답했던 건.... 평소대로 cin을 쓰는데 채점 방식이 0000이라고 입력을 한꺼번에 하는가 보다.

cin은 0000이라고 입력받으면 0 이라고 인식한다. 만약, 0010이라고 입력받으면 10으로 이해하지 0010으로 따로따로 이해하지 않는다. (내가 원하는 건 0 하나씩 받는 건데....)

그래서 C에서의 %1d를 가져왔다. C++에서는 cin.get을 사용하면 된다고 하는데 아직 시도는 안 해봄 ㅎㅎㅎㅎㅎ

다음에 비슷한 문제 나오면 써볼 계획이다.

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

데임.....ㅠㅠㅠㅠㅠㅠ (이게 다 %1d 때문이야 ㅠㅜㅜㅠㅜ)

728x90
반응형

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

10) 백준 4796 - 캠핑  (0) 2020.10.08
9) 백준 1138 - 한 줄로 서기  (0) 2020.10.08
7) 백준 1946 - 신입사원  (0) 2020.10.08
6) 백준 1541 - 잃어버린 괄호  (0) 2020.10.08
5) 백준 2217 - 로프  (0) 2020.10.08
Comments