본문으로 바로가기

백준 02630 - 색종이 만들기

category BOJ 백준/Divide & Conquer 2020. 11. 8. 00:09

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

 

2630번: 색종이 만들기

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

www.acmicpc.net

 

고려사항

- 분할정복 기법 사용.

- 통일되지 않은 n * n 색종이라면 시작점을 구분지어 n / 2 크기로 분할 후 재검사 ( 25 - 29 라인 )

- color 값을 넘겨 주어 일치여부 판별

- n == 1 일때, 조사중인 색상과 다르다면, 25 - 29 라인 진입 않고, return 0

 

#include <iostream>
using namespace std;

int divide(int y, int x, int n, int paper[][129], int color){
    bool isComplete = true;
    int cnt = 0;

    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            if(color != paper[i+y][j+x]){
                isComplete = false;
                break;
            }
        }
    }

    if(isComplete){
        return 1;
    }

    if(n == 1){
        return 0;
    }

    for(int i=0;i<2;++i){
        for(int j=0;j<2;++j){
            cnt += divide((y + n * i / 2), (x + n * j / 2), n / 2, paper, color);;
        }
    }

    return cnt;
}

int main() {
    int n, blue, white;
    int paper[129][129];

    cin>>n;
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            cin>>paper[i][j];
        }
    }

    white = divide(1, 1, n, paper, 0);
    blue = divide(1, 1, n, paper, 1);

    cout<<white<<"\n"<<blue;
    return 0;
}

'BOJ 백준 > Divide & Conquer' 카테고리의 다른 글

백준 11444 - 피보나치 수 6  (0) 2020.11.11
백준 01629 - 곱셈  (0) 2020.11.11
백준 01780 - 종이의 개수  (0) 2020.11.11
백준 01992 - 쿼드트리  (0) 2020.11.08