[백준 / C언어] 1780번: 종이의 개수

728x90
728x90

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

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수

www.acmicpc.net

난이도: solved.ac 실버 2

 

 

재귀를 이용하면 쉽게 풀 수 있다

 

먼저 시작점 arr[0][0]를 기준으로 find 라는 함수를 불렀다

 

이때 find 함수는 아래와 같다

 

int find(int x, int y, int N) {
	...
}

 

x와 y는 각각 arr의 행, 열을 의미하고 N은 종이의 크기를 나타낸다

 

find 함수 안에서는 base라는 변수로 arr[x][y]를 기준으로 잡아주고

 

한 칸씩 이동하며 base와 같은지 다른지 비교한다

 

이때 다른 수가 나오면 9등분하여 find를 다시 9번 호출하고

 

이때 diff라는 변수를 1로 바꿔주는데,

 

이는 다른 숫자를 발견해서 9등분 했으니 더 이상 비교 안 해도 된다는 걸 나타낸다

 

그리고 만약 모두 같은 수이면 answer라는 배열 내에 base 값의 개수를 하나 증가시켜 저장한다

 

answer[0]: -1의 개수

answer[1]: 0의 개수

answer[2]: 1의 개수

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MAX 2187

int arr[MAX][MAX];
int answer[3];
void find(int x, int y, int N);

int main() {
	int N, i, j;
	scanf("%d", &N);

	for (i = 0; i < N; i++)
		for (j = 0; j < N; j++)
			scanf("%d", &arr[i][j]);

	find(0, 0, N);
	printf("%d\n%d\n%d\n", answer[0], answer[1], answer[2]);
	return 0;
}

void find(int x, int y, int N) {
	int i, j, k, l;
	int base = arr[x][y];
	int diff = 0;
	/* 다른 수가 나와서 9등분 하게 되면 diff = 1이 됨 */
	for (i = x; i < x + N; i++) {
		for (j = y; j < y + N; j++) {
			/* 다른 수가 나오는 경우 */
			/* 한 번 9등분 하고나면 그 크기에서 더 이상 확인할 필요 없으므로 */
			if (arr[i][j] != base && diff == 0) {
				diff = 1;
				for (k = 0; k < 3; k++) {
					for (l = 0; l < 3; l++) {
						find(x + k * N / 3, y + l * N / 3, N / 3);
					}
				}
			}
		}
	}
	if (diff == 0)
		answer[base + 1]++;
}

 

(반례 모음)

 

3
1 1 1
1 -1 1
1 1 1


27
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

반응형