본문 바로가기
백준

백준 2630 색종이 만들기

by 콩순이냉장고 2020. 7. 20.

문제 URL : https://www.acmicpc.net/problem/2630

 

2630번: 색종이 만들기

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

www.acmicpc.net

 

문제 접근법

어떤기준점에서 그사이즈만큼 같은지 확인하고 그것이 다르다면

왼쪽상단 오른쪽 상단 왼쪽하단 오른쪽하단 이렇게 나누어 주는데 4개로 나누게 되지만 사이즈는 그림에 나와있는것처럼 size/2가됨 총4개로 분할하니 당연한것

 

그렇게해서 나눠지지 않을때까지 나눠주고 기준점이 white 인지 black인지 확인하여 그갯수만 count해주면 끝

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <queue>
using namespace std;
int quad[128][128];
int white = 0;
int black = 0;
bool isdivide(int y, int x, int size)
{
    int c = quad[y][x];
    for (int i = y; i < y + size; i++)
    {
        for (int j = x; j < x + size; j++)
        {
            if (c != quad[i][j]){//다른것이있다면 바로  나눌수있음
                return true;
            }
        }
    }
    return false;
}
 
void makequad(int y, int x, int size){
    if (isdivide(y, x, size)){//나눌수있다면 쿼드트리가아님
        int halfsize = size / 2;
        makequad(y, x, halfsize);
        makequad(y, x + halfsize, halfsize);
        makequad(y + halfsize, x, halfsize);
        makequad(y + halfsize, x + halfsize, halfsize);
    }
    else//더이상 나누어지지 않는 쿼드
    {
        if (quad[y][x])
            black++;
        else
            white++;
    }
}
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
        cin >> quad[i][j];
    makequad(00, n);
    cout << white << "\n";
    cout << black << "\n";
}
 
 
cs

 

 

궁금한점이나 모르는점이있는경우 언제든지 질문은 댓글로 부탁드립니다. ㅎㅎ

 

 

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

백준 1890 점프  (0) 2020.07.22
백준 17830 이진수씨의 하루 일과  (0) 2020.07.22
백준 5427 불  (0) 2020.07.20
백준 1992 쿼드트리  (0) 2020.07.20
백준 1456 거의 소수  (0) 2020.07.20