본문 바로가기
코딩테스트/분할 정복

쿼드 트리 압축하기

by Luigi.yoon 2023. 8. 7.

문제 : https://www.acmicpc.net/problem/1992

 

1992번: 쿼드트리

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

www.acmicpc.net

 

입력

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

출력

영상을 압축한 결과를 출력한다.

예제 입력 1 복사

8
11110000
11110000
00011100
00011100
11110000
11110000
11110011
11110011

예제 출력 1 복사

((110(0101))(0010)1(0001))

 

 

public static void main(String[] args) {

    String[] src = {
            "11110000",
            "11110000",
            "00011100",
            "00011100",
            "11110000",
            "11110000",
            "11110011",
            "11110011"
    }; // ((110(0101))(0010)1(0001))
    zipTree(src);

    src = new String[]{
            "00000000",
            "00000000",
            "00001111",
            "00001111",
            "00011111",
            "00111111",
            "00111111",
            "00111111"
    }; // (0(0011)(0(0111)01)1)
    zipTree(src);


}

public static void zipTree(String[] src) {

    String [][] input = new String[src.length][];
    for(int i=0; i<src.length; i++) {
        input[i] = new String[src.length];
        for(int j=0; j<src[i].length(); j++) {
            input[i][j] = String.valueOf(src[i].charAt(j));
        }
    }

    System.out.println(zipTree(input, 0, 0, src.length));
}

public static String zipTree(String [][] input, int x, int y, int length) {
    if(length < 2) {
        return input[y][x];
    }

    int mid = length / 2;
    int midX = x + mid;
    int midY = y + mid;

    String upperLeft = zipTree(input, x, y, mid);
    String upperRight = zipTree(input, midX, y, mid);
    String lowerLeft = zipTree(input, x, midY, mid);
    String lowerRight = zipTree(input, midX, midY, mid);

    if(upperLeft.equals(upperRight)
            && upperLeft.equals(lowerLeft)
            && upperLeft.equals(lowerRight)) {
        return upperLeft;
    }

    return new StringBuilder("(")
            .append(upperLeft)
            .append(upperRight)
            .append(lowerLeft)
            .append(lowerRight)
            .append(")").toString();
}

'코딩테스트 > 분할 정복' 카테고리의 다른 글

쿼드 트리 뒤집기 (문제 ID: QUADTREE, 난이도: 하)  (0) 2023.08.03
Quick sort  (0) 2023.08.01
Merge sort  (0) 2023.08.01