Algorithm

백준 1992 쿼드트리

dalooong 2023. 7. 11. 09:53
 

1992번: 쿼드트리

첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또

www.acmicpc.net

문제 코드 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    // 입력에 대한 정보를 클래스 필드로 저장한다.
    // 입력된 0과 1로 구성된 이미지
    private char[][] image;
    // 결과를 저장하기 위한 StringBuilder
    public StringBuilder quadTreeBuilder;

    private void solution() throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(reader.readLine());
        image = new char[n][];
        for (int i = 0; i < n; i++) {
            // String.toCharArray()를 사용하면 문자열을 char[]로 변환 가능
            image[i] = reader.readLine().toCharArray();
        }
        quadTreeBuilder = new StringBuilder();
        compressQuad(n, 0, 0);
        System.out.println(quadTreeBuilder.toString());
    }

    private void compressQuad(
            // n: 정사각형의 한변의 길이
            int n,
            // x: 정사각형의 시작 x index
            int x,
            // y: 정사각형의 시작 y index
            int y
    ) {
        // 조건을 마족했는지 검사하는 flag
        boolean success = true;
        // 모든 요소가 같지 않을 경우 success = false 를 해준다.
        // x, y의 값을 저장해두고
        // x ~ x + n - 1, y ~ y + n - 1 까지 반복하면서
        // 초기의 값과 달라지는지를 검사한다.
        char init = image[x][y];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (image[x + i][y + j] != init) {
                    success = false;
                    break;
                }
            }
            if (!success) break;
        }
        // 원소들 검사 후 success == false 라면 쪼개서 재귀호출
        if (!success) {
            // 좌 괄호 입력
            quadTreeBuilder.append('(');
            // 4등분을 위한 half
            int half = n / 2;
            for (int i = 0; i < 2; i++){
                for (int j = 0; j < 2; j++) {
                    compressQuad(
                            half,
                            x + half * i,
                            y + half * j
                    );
                }
            }
            // 4등분 영상이 압축이 끝나면 우괄호 입력
            quadTreeBuilder.append(')');
        } else {
            // 모든 원소가 일치했다면 첫번째 검사한 원소를 입력
            quadTreeBuilder.append(init);
        }
    }

    public static void main(String[] args) throws IOException {
        new Main().solution();
    }

}

출력 결과

입력
8
11110000
11110000
00011100
00011100
11110000
11110000
11110011
11110011

출력 
((110(0101))(0010)1(0001))