본문 바로가기

ALGORITHM

백준 1992 쿼드 트리 (Java)

1. 문제 링크

 

1992번: 쿼드트리

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

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

N이 언제나 2의 제곱수라는 것에서 분할 정복을 해야한다고 생각했다.

 

왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래 순서로 압축이 된다고 하니 4분면으로 나누고 재귀를 했다.

=> round 메서드 (시작 x 좌표, 시작 y 좌표, 탐색할 길이)

 

만약 4분면이 모두 동일한 값이라면 재귀를 하지 않고 값을 내보낸다.

=> same 메서드 (시작 x 좌표, 시작 y 좌표, 검사할 길이)

 

 

4. 코드

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

public class Main {
	static int N;
	static String[][] tf;
	static StringBuilder sb = new StringBuilder();
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		tf = new String[N][N];
		
		for(int i=0;i<N;i++) {
			String[] temp = br.readLine().split("");
			for(int j=0;j<N;j++) {
				tf[i][j] = temp[j];
				
			}
		}
		
		round(0, 0, N);
		System.out.println(sb);
		
	}

	private static void round(int x, int y, int n) {
		if(same(x, y, n)) {
			sb.append(tf[x][y]);
		}
		else {
			int half = n/2;
			sb.append("(");
			round(x, y, half);
			round(x, y+half, half);
			round(x+half, y, half);
			round(x+half, y+half, half);
			sb.append(")");
		}
	}

	private static boolean same(int x, int y, int n) {
		if(n == 1) { //1개짜리
			return true;
		}
		else {
			String first = tf[x][y];
			for(int i=x;i<x+n;i++) {
				for(int j=y;j<y+n;j++) {
					if(!tf[i][j].equals(first)) {
						return false;
					}
				}
			}
		}
		return true;
	}
}

 

'ALGORITHM' 카테고리의 다른 글

백준 18870 좌표 압축 (Java)  (0) 2023.02.28
백준 2563 색종이 (Java)  (0) 2023.02.27
백준 11286 절댓값 힙 (Java)  (0) 2023.02.25
백준 23971 ZOAC 4 (Java)  (0) 2023.02.24
백준 16935 배열 돌리기 3 (Java)  (0) 2023.02.23