안녕 세상아,

[c++/백준] 2630 색종이 만들기 본문

백준

[c++/백준] 2630 색종이 만들기

돈 많은 백수가 되고싶다 2023. 6. 21. 17:10

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

 

2630번: 색종이 만들기

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

www.acmicpc.net

분할정복 문제를 처음 접해봐서 여러 블로그들을 참고해서 풀었다. 

자세한 설명에 코드에 적어놓았다.

#include <iostream>
using namespace std;

int white = 0;
int black = 0;
int map[130][130];
int n;

//x_start, y_start --> 현재 탐색하고자 하는 사분면의 가장 왼쪽 위 좌표
//s_size --> 사분면 한 변의 길이
void division(int x_start, int y_start, int s_size) {
	//현재 x_start,y_start 좌표에 있는 색종이의 색 할당
	int check = map[x_start][y_start];
	for (int i = x_start; i < x_start + s_size; i++) {
		for (int j = y_start; j < y_start + s_size; j++) {
			//check와 다른 색상이 현재 사분면에 존재하는지 판별
			if (check == 0 && map[i][j] == 1) {
				check = 2;
			}
			else if (check == 1 && map[i][j] == 0) {
				check = 2;
			}
			//다른 색상이 현재 사분면에 존재하면 나눠주기
			if (check == 2) {
				//오른쪽 위 사분면 탐색
				division(x_start, y_start + s_size / 2, s_size / 2);
				//왼쪽 위 사분면 탐색
				division(x_start, y_start, s_size / 2);
				//왼쪽 아래 사분면 탐색
				division(x_start + s_size / 2, y_start, s_size / 2);
				//오른쪽 아래 사분면 탐색
				division(x_start + s_size / 2, y_start + s_size / 2, s_size / 2);
				return;
			}
		}
	}
	if (check == 0)
		white++;
	else
		black++;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> map[i][j];
		}
	}
	division(0, 0, n);
	cout << white << endl;
	cout << black << endl;
}

해도해도 모르는게 너무 많음.....자신감 급추락

'백준' 카테고리의 다른 글

[c++/백준] 11051 이항 계수 2  (0) 2023.06.28
[c++/백준] 1780 종이의 개수  (0) 2023.06.27
[c++/백준] 6603 로또  (0) 2023.06.19
[c++/백준] 11508 2+1 세일  (0) 2023.06.17
[c++/백준] 18870 좌표 압축  (0) 2023.06.16