혜랑's STORY

[BOJ_C++] 1780번 : 종이의 개수 본문

무지성 공부방/알고리즘 해결

[BOJ_C++] 1780번 : 종이의 개수

hyerang0125 2021. 8. 22. 17:05

code

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h> 

using namespace std;

int cnt[3];
int arr[2187][2187];

void paper(int size, int x, int y) {
	bool check = true;
	for (int i = x; i < x + size; i++) {
		for (int j = y; j < y + size; j++) {
			if (arr[i][j] != arr[x][y]) {
				check = false;
				break;
			}
		}
	}
	if (check) {
		cnt[arr[x][y] + 1]++;
		return;
	}
	for (int i = x; i < x + size; i += size / 3) {
		for (int j = y; j < y + size; j += size / 3)
			paper(size / 3, i, j);
	}

}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n; cin >> n;
	for (int i = 0; i < n; i++) 
		for (int j = 0; j < n; j++)
			cin >> arr[i][j];
	
	paper(n, 0, 0);

	for (int i = 0; i < 3; i++)
		cout << cnt[i] << "\n";

	return 0;
}
  • 종이의 시작을 (0, 0)이라 하고, 자를 수 있는 크기를 size라 하였다.
  • 입력받은 종이 시작 좌표와 size를 더한 자를 수 있는 종이 안을 구성하는 수가 모두 같은 수라면 cnt를 증가시킨다.
  • 이후 해당 시작 좌표부터 size를 더한 값까지 9개의 종이로 나누기 위해 각 변의 길이를 3으로 나누어 주고 다시 paper() 함수를 사용해 종이의 수를 센다.

결과