[백준 / C언어] 1080번: 행렬

728x90
728x90

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

 

1080번: 행렬

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

www.acmicpc.net

 

난이도: solved.ac 실버 1

 

 

(주의해야할 점)

행렬을 입력받을 때

1 1 0

0 1 0

0 1 0

처럼 한 칸씩 띄어져 있는게 아니라

 

110

010

010

처럼 붙여있는 형태라 "%1d"로 입력받아야 숫자 하나당 scanf를 할 수 있다

 

행렬의 크기가 3*3보다 작을 때는 무조건 -1를 출력하는 게 아니라

두 행렬이 같을 때는 0을 출력한다

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

int main() {
	int N, M, i, j;
	scanf("%d %d", &N, &M);
	
	int** matrix = (int**)calloc(N, sizeof(int*));
	for (i = 0; i < N; i++)
		matrix[i] = (int*)calloc(M, sizeof(int));

	for (i = 0; i < N; i++)
		for (j = 0; j < M; j++)
			scanf("%1d", &matrix[i][j]);
	
	int num, cnt = 0;
	for (i = 0; i < N; i++) {
		for (j = 0; j < M; j++) {
			scanf("%1d", &num);
			if (num == matrix[i][j])	// 같은 부분은 0로 표시
				matrix[i][j] = 0;
			else
				matrix[i][j] = 1;	// 다른 부분은 1로 표시
		}
	}

	if (N < 3 || M < 3) {	// 행렬의 크기가 3*3보다 작은 경우
		for (i = 0; i < N; i++) {
			for (j = 0; j < M; j++) {
				if (matrix[i][j] == 1) {
					printf("-1");	// 못 뒤집으므로
					return 0;
				}
			}
		}
		printf("0");	// 두 행렬이 같은 경우
		return 0;
	}

	for (i = 0; i < N; i++) {
		for (j = 0; j < M; j++) {
			if (matrix[i][j] == 1) {
				if (i > N - 3 || j > M - 3) {	// 다른 부분(1)이 각 모서리로부터 2칸 안에 있을 때
					printf("-1");
					return 0;
				}
				else {
					for (int x = i; x < i + 3; x++)
						for (int y = j; y < j + 3; y++)
							matrix[x][y] = !matrix[x][y];
					cnt++;
				}
			}
		}
	}
	printf("%d", cnt);

	for (i = 0; i < N; i++)
		free(matrix[i]);
	free(matrix);
	return 0;
}

행렬 문제 코드 제출 결과
코드 제출 결과

반응형