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

 

1992번: 쿼드트리

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

www.acmicpc.net

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class Main {

	static int[][] map;
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int N = Integer.parseInt(br.readLine());
		map = new int[N][N];

		for (int i = 0; i < N; i++) {
			String str = br.readLine();

			for (int j = 0; j < N; j++) {
				int num = str.charAt(j) - '0';
				map[i][j] = num;
			}
		}
		quadTree(N, 0, 0);
		System.out.println(sb);
	}

	private static void quadTree(int n, int r, int c) {
		if (check(n, r, c)) {
			sb.append(map[r][c]);
			return;
		} else {
			sb.append("(");
			quadTree(n / 2, r, c);
			quadTree(n / 2, r, c + n / 2);
			quadTree(n / 2, r + n / 2, c);
			quadTree(n / 2, r + n / 2, c + n / 2);
			sb.append(")");
		}
	}

	private static boolean check(int n, int r, int c) {
		// 압축 가능한지 확인
		int num = map[r][c];

		for (int i = r; i < r + n; i++) {
			for (int j = c; j < c + n; j++) {
				if (num != map[i][j]) {
					return false;
				}
			}
		}
		return true;
	}
}

+ Recent posts