본문 바로가기
문제 풀이/백준(BOJ)

[C++] 백준 1780번 : 종이의 개수

by 희조당 2021. 7. 27.
728x90

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

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다.

www.acmicpc.net


 문제 풀이

이전 문제들과 다르게 4 분할이 아닌 9 분할이다.

이전 문제와 비슷하게 코드를 구현할 수 있지만 '-1, 0, 1'을 조금만 바꾸면 문제가 아주 쉬워진다.

각각의 숫자를 +1 해서 '0, 1, 2'로 바꾸면 카운트할 때도 출력할 때도 쉬워진다.

 느낀 점

처음에 이전 문제와 비슷하게 코드를 구현했다. 코드가 길고 썩 깔끔한 구석이 없었다. 다른 분들의 코드를 비교하던 중 아주 깔끔한 코드를 발견하였고 공부해서 완벽하게 내 것으로 만들었다! 역시 코딩은 공부할수록 매력적이면서 심오한 것 같다.

 코드

#include <iostream>

using namespace std;

int n;
int result[3];
int map[2188][2188];

bool check(int x, int y, int n) {
	int standard = map[x][y];
	for (int i = x; i < x + n;i++) {
		for (int j = y; j < y + n;j++) {
			if (standard != map[i][j])	return false;
		}
	}
	return true;
}

void div_conq(int x, int y, int n) {
	if (check(x, y, n)) result[map[x][y]]++;
	else {
		int size = n / 3;
		for (int i = 0; i < 3;i++) {
			for (int j = 0; j < 3;j++) {
				div_conq(x + size * i, y + size * j, size);
			}
		}
	}
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	cin >> n;
	for (int i = 0; i < n;i++) {
		for (int j = 0; j < n;j++) {
			cin >> map[i][j];
			map[i][j]++;
		}
	}
	div_conq(0, 0, n);
	for (int i = 0; i < 3;i++) {
		cout << result[i] << "\n";
	}
}

댓글