개발 공부 기록

[Baekjoon 1992번/JAVA] 쿼드 트리 본문

PS/Divide and Conquer

[Baekjoon 1992번/JAVA] 쿼드 트리

나만없서고냥이 2023. 11. 10. 02:08

Question

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

 

1992번: 쿼드트리

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

www.acmicpc.net

 


💡 Solution

주어진 영상이 모두 0이거나 모두 1이어야 영상을 압축할 수 있으며, 0과 1이 섞여있다면 영상을 4개로 나누어 다시 각각의 영상이 모두 0 혹은 1로만 이루어져 있는지 확인하고 압축하는 방식을 거칩니다. 즉 아래와 같은 과정을 반복합니다.

 

1. 영상이 모두 0이거나 1로만 이루어져 있는지 확인한다.

2. 모두 0이거나 1이라면, 영상을 압축한다. 

3. 0과 1이 섞여있다면 영상을 4개로 나누고, 나누어진 각각의 영상마다 다시 1단계를 수행한다.

 

사실, 백준의 "색종이 만들기" 문제를 풀어봤다면 문제 이해는 금방 되지만 결과를 어떻게 도출한 건지 이해가 바로 되지 않았습니다. 하지만 그림으로 그려보니 금방 이해가 가더라구요 ..😂 

 

그리고 영상을 4개로 분할할 때 분할 순서(왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래)에 유의하셔야 됩니다! 순서에 따라 정답도 달라지기 때문입니당.

 

💻 Code

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

public class BJ1992 {
	static int N;
	static int[][] arr;
	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());
		arr = new int[N][N];
		for(int i = 0; i < N; i++) {
			String str = br.readLine();
			for (int j = 0; j < N; j++) {
				arr[i][j] = str.charAt(j) - '0';
			}
		}
		partition(0, 0, N);
		System.out.println(sb);
	}
	
	public static void partition(int row, int col, int size) {
		if (isSameColor(row, col, size)) {
			sb.append(arr[row][col]);
			return;
		}
		
		// 새로 분할할 때마다 ()를 추가해야한다.
		sb.append('(');
		
		int partitionSize = size / 2;
		partition(row, col, partitionSize);
		partition(row, col + partitionSize, partitionSize);
		partition(row + partitionSize, col, partitionSize);
		partition(row + partitionSize, col + partitionSize, partitionSize);
		
		sb.append(')');
	}
	
	public static boolean isSameColor(int row, int col, int size) {
		int color = arr[row][col];
		
		for (int i = row; i < row + size; i++) {
			for (int j = col; j < col + size; j++) {
				if (arr[i][j] != color) {
					return false;
				}
			}
		}
		
		return true;
	}

}

'PS > Divide and Conquer' 카테고리의 다른 글

[Baekjoon 2630번/JAVA] 색종이 만들기  (0) 2023.11.09