ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2630번 : 색종이 만들기
    알고리즘 공부 2020. 3. 26. 11:05

      한 영역 안에 있는 종이의 색이 같지 않다면 4등분을 하는 문제다. 다행히도 전체 종이의 한 변의 길이가 항상 2^k인 형태이기 때문에 등분을 했을 때 항상 깔끔하게 떨어지는게 보장된다. (만약 한 변의 길이가 7이였다면 4등분 자체를 할 수 가 없다.)

     

      그렇다면 내가 판정해야 할 제일 중요한 요소는 N*N의 이차원 Array 안의 원소가 모두 동일한 색인가?이다. 이것만 따로 코드로 옮겨보면 다음과 같다.

    void check(int size, int startX, int startY)
    {
        int target = arr[startX][startY];
        
        for(int x = startX; x < startX + size; x++)
        {
            for(int y = startY; y < startY + size; y++)
            {
                if(arr[x][y] != target)
                {
                    // 다른 색의 종이가 발견됐습니다.
                    
                    return;
                }
            }
        }
        
        // 모두 같은 색입니다.
    }
    • size : 체크할 정사각형의 한 변의 길이
    • startX : 체크를 시작할 X 위치
    • startY : 체크를 시작할 Y 위치

      체크를 시작할 위치의 색을 target에 저장하고 이중 for문을 돌면서 단 하나라도 target과 다르다면 다른 색이 발견된 것이다. 따라서 다른 색의 종이가 발견됐을 경우에는 size를 반으로 줄여서 4등분한 구간을 각각 따로 다시 체크해주면 된다.

    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    int n;
    int arr[129][129];
    int w;
    int b;
    
    void check(int size, int startX, int startY)
    {
        int target = arr[startX][startY];
        
        for(int x = startX; x < startX + size; x++)
        {
            for(int y = startY; y < startY + size; y++)
            {
                if(arr[x][y] != target)
                {
                    check(size/2, startX, startY);
                    check(size/2, startX + size/2, startY);
                    check(size/2, startX, startY + size/2);
                    check(size/2, startX + size/2, startY + size/2);
                    
                    return;
                }
            }
        }
        
        if(target == 0) w++;
        else b++;
    }
    
    int main()
    {
        cin >> n;
        
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n ; j++)
            {
                cin >> arr[i][j];
            }
        }
        
        check(n, 0, 0);
        
        cout << w << "\n" << b;
    }

    '알고리즘 공부' 카테고리의 다른 글

    백준 1699번 : 제곱수의 합  (0) 2020.03.30
    백준 9471번 : 피사노 주기  (0) 2020.03.29
    백준 1629번 : 곱셈  (0) 2020.03.27
    백준 1780번 : 종이의 개수  (1) 2020.03.27
    백준 1992번 : 쿼드트리  (0) 2020.03.26
Designed by Tistory.