Baekjoon Review

[Silver 2] 1780 종이의 개수

hanseongbugi 2024. 9. 14. 17:14

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

 

종이를 자를 때는 같은 크기의 종이를 9등분 한다.

이는 분할 정복을 사용하여 문제를 해결해야 함을 알 수 있다.

 

종이를 자를 때 N = 9인 경우 크기 3인 종이가 9개 존재하게된다.

따라서 원래 종이의 크기가 n인 경우 다음 종이는 n/3이 된다는 것을 알 수 있다.

 

종이를 자를지 선택할 때는 paper[y][x]의 값이 paper[y부터 y + size][x부터 x + size 값] 에 있는 값이 다를 경우 자른다.

 

자르지 않는 경우 paper[y][x]에 존재하는 값을 count하면 된다.

 

#include <iostream>
using namespace std;

int N;
int paper[2200][2200];
int onePaper = 0;
int zeroPaper = 0;
int minousPaper = 0;

void FindPaper(int y, int x, int n){
    bool same = true;

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


    if(same){
        if(paper[y][x] == 0)
            zeroPaper++;
        else if(paper[y][x] == 1)
            onePaper++;
        else
            minousPaper++;
    }
    else{
        FindPaper(y, x, n/3);
        FindPaper(y + n / 3, x, n/3);
        FindPaper(y + n / 3 + n / 3, x, n/3);
        FindPaper(y, x + n / 3, n/3);
        FindPaper(y, x + n / 3 + n / 3, n/3);
        FindPaper(y + n / 3, x + n / 3, n/3);
        FindPaper(y + n / 3, x + n / 3 + n / 3, n/3);
        FindPaper(y + n / 3 + n / 3, x + n / 3, n/3);
        FindPaper(y + n / 3 + n / 3, x + n / 3 + n / 3, n/3);
    }
}

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>>paper[i][j];
    }
    FindPaper(0, 0, N);

    cout<<minousPaper<<'\n';
    cout<<zeroPaper<<'\n';
    cout<<onePaper<<'\n';

}