ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1992번 : 쿼드트리
    알고리즘 공부 2020. 3. 26. 23:35

      백준 2630번 : 색종이 만들기에 이어서 다음 분할 정복 문제다. 거의 비슷한 문제였기 때문에 2630번의 코드를 그대로 사용했다. (2630번 풀이 : https://stillchobo.tistory.com/72) 2630번과 다른 점은 '0 묶음'과 '1 묶음'의 개수를 세는 것과 다르게 4분할 할 시 괄호를 이용해 구분을 해줘야 한다는 점이다. 그래서 4분할 재귀를 하기 전에 괄호를 열고 닫음으로서 그 부분을 해결했다.

     

      의외로 애 먹었던 지점은 input을 읽는 과정이였는데 처음에는 int로 한 줄을 읽고 10씩 나누면서 배열에 할당했다. 그런데 그렇게 하니까 예제는 잘 되는데 틀렸다고 하길래 '도대체 왜?!'라고 10분 동안 짜증내다가 생각해보니까 64자리 숫자는 int는 커녕 long long으로도 못 읽는다! 엌...... 머쓱타드.... 그래서 결국 string으로 읽고 ASCII 코드 개념을 이용해 '0'을 빼주는 방식으로 읽었다.

     

    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    int n;
    int arr[64][64];
    
    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)
                {
                    cout << "(";
                    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);
                    cout << ")";
                    
                    return;
                }
            }
        }
        
        if(target == 0) cout << "0";
        else cout << "1";
    }
    
    int main()
    {
        cin >> n;
        
        for(int i = 0; i < n; i++)
        {
            string s;
            cin >> s;
            
            for(int j = 0; j < n ; j++)
            {
                arr[j][i] = s[j] - '0';
            }
        }
        
        check(n, 0, 0);
    }

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

    백준 1699번 : 제곱수의 합  (0) 2020.03.30
    백준 9471번 : 피사노 주기  (0) 2020.03.29
    백준 1629번 : 곱셈  (0) 2020.03.27
    백준 1780번 : 종이의 개수  (1) 2020.03.27
    백준 2630번 : 색종이 만들기  (0) 2020.03.26
Designed by Tistory.