백준 Silver2 #1780 종이의 개수

김리나·2023년 3월 27일
0

알고리즘

목록 보기
8/8

문제


풀이

종이 안의 숫자가 같은지 확인하고 같다면 변수에 +1을 하고 아니라면 다시 9개로 나누는 일을 반복하도록 한다

종이 안의 숫자가 같은지 확인하는 코드

int num = mat[row][col];

for (int i = row; i < row + size; i++) {
	for (int j = col; j < col + size; j++) {
    	//숫자가 다르면 0을 반환하고 함수를 끝낸다
		if (mat[i][j] != num)
           	return 0;
	}
}
//숫자가 모두 같으므로 1을 반환한다
return 1;

전체 코드

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


int** mat; //종이
int n_one = 0; // -1
int zero = 0; // 0
int one = 0; // 1

//종이 안의 숫자가 같은지 확인하는 함수
int check(int row_s, int col_s, int size) {
	int num = mat[row_s][col_s];

	for (int i = row_s; i < row_s + size; i++) {
		for (int j = col_s; j < col_s + size; j++) {
			if (mat[i][j] != num)
				return 0;
		}
	}

	return 1;
}

void divide(int row_s, int col_s, int size) 
{
	//종이 안의 숫자가 같다면
	if (check(row_s, col_s, size)) {
		//해당 숫자에 +1 하고 함수를 끝낸다
		if (mat[row_s][col_s] == -1) n_one++;
		else if (mat[row_s][col_s] == 0) zero++;
		else  one++;

		return;
	}
	//종이 안의 숫자가 같지 않다면 종이를 9개로 나눠야하므로 size를 3으로 나눈다.
	int newsize = size / 3;
	
    //첫번째 줄
	divide(row_s, col_s, newsize);
	divide(row_s, col_s + newsize, newsize);
	divide(row_s, col_s + 2*newsize, newsize);
	//두번째 줄
	divide(row_s + newsize, col_s, newsize);
	divide(row_s + newsize, col_s + newsize, newsize);
	divide(row_s + newsize, col_s + 2*newsize, newsize);
	//세번째 줄
	divide(row_s + 2 * newsize, col_s, newsize);
	divide(row_s + 2 * newsize, col_s + newsize, newsize);
	divide(row_s + 2 * newsize, col_s + 2 * newsize, newsize);
}

int main() {
	int n;
	scanf_s("%d", &n);
	//행, 열의 크기가 n 인 2차원 배열 만들기
	mat = (int**)malloc(sizeof(int*) * n);
	for (int i = 0; i < n; i++) {
		mat[i] = (int*)malloc(sizeof(int) * n);
	}

	int item;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			scanf_s("%d", &item);
			mat[i][j] = item;
		}
	}

	divide(0, 0, n);

	printf("%d\n%d\n%d", n_one, zero, one);
}

0개의 댓글