🖥️ CS/Baekjoon Algorithms

#2630번 색종이 만들기 (C++)

한국의 메타몽 2020. 11. 19. 16:36

링크 : www.acmicpc.net/problem/2630

 

2630번: 색종이 만들기

첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.

www.acmicpc.net

재귀를 통해 풀었으며, 얼핏보면 DFS와 비슷한 원리의 문제이다.

분할정복으로 분류되어있는데, 문제에서 언급되었듯이 정확히 반씩 탐색하면 되는 문제이므로

그리 복잡한 원리를 요구하지 않는다. 

 

문제풀이는 다음과 같다.

1. 재귀를 통해 1번째 배열부터 마지막번호까지 재귀함수를 진행한다. 

2. 만약 지정된 범위의 타일을 모두 세었을 때, 하얀 타일이나 파란 타일의 갯수가 0개라면 

색종이가 완성된다.

3. 그렇지 않을 경우에 아래와 같이 네 분할로 나누어 다시 재귀를 진행한다. 

1사분면 2사분면
3사분면 4사분면
#include <iostream>
using namespace std;

int n = 0, arr[129][129], wh = 0, bl = 0;

void check(int starty, int startx, int endy, int endx) {
	int white = 0, blue = 0;
	for (int i = starty; i <= endy; i++) {
		for (int j = startx; j <= endx; j++) {
			if (arr[i][j] == 0) white++;
			else blue++;
		}
	}
	if (blue == 0||white==0) {
		if (blue == 0) wh++;
		else bl++;
	}
	else {
		check(starty, startx, (starty+endy) / 2, (startx+endx) / 2); // 1사분면
		check(starty, (startx+endx)/2+1,(starty+endy)/2,endx); // 2사분면
		check((starty+endy)/2+1, startx, endy, (startx+endx)/2); // 3사분면
		check((starty + endy) / 2 + 1, (startx + endx) / 2 + 1, endy, endx); //4사분면
	}
}

int main() {
	ios::sync_with_stdio(NULL);
	cin.tie(NULL);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) cin >> arr[i][j];
	}
	check(1, 1, n, n);
	cout << wh << "\n" << bl << "\n";
	return 0;
}

 

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#1780번 종이의 개수 (C++)  (0) 2020.11.20
#1992번 쿼드트리 (C++)  (0) 2020.11.20
#5430번 AC (C++)  (0) 2020.11.19
#1021번 회전하는 큐 (C++)  (0) 2020.11.18
#2565번 전깃줄 (C++)  (0) 2020.11.17