https://www.acmicpc.net/problem/2630
전체 색깔정보를 그래프에 저장하고 이를 함수를 통해 순회하면서 만약 같은 전체 종이가 모두 같은 색이라면 그 종이의 색을 카운트에 추가해주고 아니라면 4등분으로 나누어서 다시 순회하는 과정을 잘라진 종이가 모두 하얀색 또는 모두 파란색으로 칠해져 있거나, 하나의 정사각형 칸이 되어 더 이상 자를 수 없을 때까지 반복한다.
정답코드
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> graph;
int whitecnt = 0;
int bluecnt = 0;
bool isSameColor(int x, int y, int size) {
int color = graph[x][y]; // 첫 번째 칸의 색
for (int i = x; i < x + size; i++) {
for (int j = y; j < y + size; j++) {
if (graph[i][j] != color) {
return false; // 다른 색이 섞여 있으면 false 반환
}
}
}
return true; // 모두 같은 색이면 true 반환
}
// 분할 정복 함수
void divideAndConquer(int x, int y, int size) {
if (isSameColor(x, y, size)) {
// 모두 같은 색이면 해당 색에 따라 개수 증가
if (graph[x][y] == 0) {
whitecnt++;
}
else {
bluecnt++;
}
}
else {
// 다른 색이 섞여 있으면 4등분하여 재귀적으로 호출
int newSize = size / 2;
divideAndConquer(x, y, newSize); // 왼쪽 위
divideAndConquer(x, y + newSize, newSize); // 오른쪽 위
divideAndConquer(x + newSize, y, newSize); // 왼쪽 아래
divideAndConquer(x + newSize, y + newSize, newSize); // 오른쪽 아래
}
}
int main()
{
int n;
cin >> n;
graph.resize(n, vector<int>(n));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> graph[i][j];
}
}
divideAndConquer(0, 0, n);
cout << whitecnt << "\n";
cout << bluecnt << "\n";
return 0;
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준][C++]1780번. 종이의 개수 (0) | 2024.11.12 |
---|---|
[백준][C++]1992번. 쿼드트리 (0) | 2024.11.11 |
[백준][C++]1786번. 찾기 (0) | 2024.11.09 |
[백준][C++]2579번. 계단 오르기 (2) | 2024.11.08 |
[백준][C++]11053번. 가장 긴 증가하는 부분 수열 (1) | 2024.11.07 |