[BOJ/백준] 1992번 : 쿼드트리 (Java)
📘 백준 1992번 : 쿼드트리
💡 문제 풀이
영상 데이터를 재귀적으로 4등분(분할 정복)하며 압축.
모든 픽셀이 같은 값인지 확인(재귀 종료 조건)하고, 같다면 해당 값 출력.
다르다면 괄호 ()로 감싸서 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래 순으로 결과 연결.
왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래를 재귀적으로 함수를 호출하여 결과 도출.
✅ 코드 (Java)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// https://www.acmicpc.net/problem/1992
// 영상의 구조를 재귀적으로 4등분으로 나누어 압축
// 모든 픽셀이 같은 값인지 확인하고, 같다면 해당 값 출력
// 다르다면 괄호 ()로 감싸서 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래 순으로 결과 연결
public class B1992_쿼드트리 {
public static char[][] video; // 영상 구조
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 처음 영상 크기
video = new char[N][N]; // 영상 구조
for (int i = 0; i < N; i++) { // video[][] 채우기
video[i] = br.readLine().toCharArray();
}
System.out.println(dc(0, 0, N)); // 압축 결과 출력
br.close();
}
public static String dc(int x, int y, int size) { // 쿼드 트리 구조로 압축
if (isSameColor(x, y, size)) { // 주어진 구역이 모두 같은 숫자면(재귀 종료 조건)
return String.valueOf(video[x][y]); // 숫자 반환
}
int newSize = size / 2; // 분할 정복용 크기
String leftTop = dc(x, y, newSize); // 왼쪽 위
String rightTop = dc(x, y + newSize, newSize); // 오른쪽 위
String leftBottom = dc(x + newSize, y, newSize); // 왼쪽 아래
String rightBottom = dc(x + newSize, y + newSize, newSize); // 오른쪽 아래
return "(" + leftTop + rightTop + leftBottom + rightBottom + ")"; // 분할한 값 합치기
}
public static boolean isSameColor(int x, int y, int size) { // 주어진 구역이 같은 색(숫자)인지 확인
char first = video[x][y]; // 처음 값
int xEnd = x + size;
int yEnd = y + size;
for (int i = x; i < xEnd; i++) {
for (int j = y; j < yEnd; j++) {
if (video[i][j] != first) { // 값이 다르면
return false;
}
}
}
return true; // 값이 모두 같으면
}
}
💾 제출 결과
🧩 새롭게 알게 된 점
-
쿼드 트리(Quad Tree) 구조
2차원 공간을 반복적으로 네 부분으로 분할하는 트리 형태의 자료구조
영상 압축에서 각 구역의 값이 같으면 해당 값을 저장하고, 그렇지 않으면 4개의 하위 구역으로 나누어 다시 같은 방식으로 처리
일반적으로 이미지, 영상, 지리 정보처럼 2차원 데이터를 효율적으로 표현할 때 사용됨