옆에 종이랑 비교하다가 다르면 n을 2로 나누고 재귀로 풀자
라고 생각했었고 두번 헤맸다.
첫번째는 n*n블록 안에 하나라도 다른 색깔이 있는지 없는지가 중요한거지 옆에 종이랑 다른것이 중요한 것이 아니었다.
그래서 이중 for 문을 통해 옆에 종이랑 비교하려다 보니까 이미 자른 종이를 또 잘랐다^^
두번째는 1,1 부터 검사하고 1,3 -> 3,1 -> 3,3 순으로 검사하고 싶었는데. 재귀를 어떻게 해야할지 몰라서 헤맸다.
그냥 함수 호출을 4번하면 됐었던 것..^^
최종 풀이 : y,x 부터 가로, 세로 크기가 n인 정사각형 범위에서 1이면 cnt를 증가 시킨다.
cnt==0이면 전부 0만 들어가 있는 것이므로 white++
cnt==n*n이면 전부 1만 들어가 있는 것이므로 blue++
둘 다 아니면 블록 안에 1,0둘다 있는 것이므로 함수를 호출한다.
#include<iostream>
using namespace std;
int n;
int paper[129][129];
int blue, white;
void division(int y,int x,int N)
{
int cnt = 0;
for (int i = y; i < y + N; i++)
for (int j = x; j < x + N; j++)
if (paper[i][j])
cnt++;
if (!cnt) //다 0이면
white++;
else if (cnt == (N*N))//다 1이면
blue++;
else//한개라도 다른게 있으면
// (처음엔 옆에 있는 것끼리 비교했는데 블록에 다른게 하나라도 있으면 division 해야하기때문에 굳이x)
{
division(y, x, N / 2);
division(y, x + N / 2, N / 2);
division(y + N / 2, x, N / 2);
division(y + N / 2, x + N / 2, N / 2);
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> paper[i][j];
division(1,1,n);
cout << white << "\n" << blue;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 9461파도반수열 c++ (0) | 2022.03.24 |
---|---|
[백준]9663N-Queen c++ (0) | 2022.03.19 |
[백준] 9095 1, 2, 3 더하기 c++ (0) | 2022.03.19 |
[백준] 11399 ATM c++ (0) | 2022.03.17 |
[백준]11066파일 합치기 (0) | 2022.03.17 |