728x90
반응형
SMALL
백준 저지에서 쿼드트리를 자바를 통해 풀어 보았다.
https://www.acmicpc.net/problem/1992
1992번 쿼드트리
문제
흑백 영상을 압축하여 표현하는 데이터 구조로 쿼드 트리(Quad Tree)라는 방법이 있다. 흰 점을 나타내는 0과 검은 점을 나타내는 1로만 이루어진 영상(2차원 배열)에서 같은 숫자의 점들이 한 곳에 많이 몰려있으면, 쿼드 트리에서는 이를 압축하여 간단히 표현할 수 있다.
주어진 영상이 모두 0으로만 되어 있으면 압축 결과는 "0"이 되고, 모두 1로만 되어 있으면 압축 결과는 "1"이 된다. 만약 0과 1이 섞여 있으면 전체를 한 번에 나타내지를 못하고, 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래, 이렇게 4개의 영상으로 나누어 압축하게 되며, 이 4개의 영역을 압축한 결과를 차례대로 괄호 안에 묶어서 표현한다
위 그림에서 왼쪽의 영상은 오른쪽의 배열과 같이 숫자로 주어지며, 이 영상을 쿼드 트리 구조를 이용하여 압축하면 "(0(0011)(0(0111)01)1)"로 표현된다. N ×N 크기의 영상이 주어질 때, 이 영상을 압축한 결과를 출력하는 프로그램을 작성하시오.
설명
영상에 대해서 전체가 0 또는 1이라면 0 또는 1로 압축할 수 있다. 만약 0또는 1이 아니라면 영상을 4등분하여 다시 전체가 0 또는 1인지 확인한다.
재귀함수를 통해 문제를 풀었다. 영상인 이차배열에 대해서 배열 전체를 탐색하여 압축할 수 있는지 확인한다. 만약 압축할 수 있다면 압축을 진행한다. 압축을 할 수 없다면 영상을 4등분한다. 영상을 4등분하기위해 4개의 이차배열을 선언하여 순서대로 저장했다. 새로 생성한 4개의 이차배열에 대해서 같은 과정을 반복한다. 이때 괄호는 압축이 불가할 경우 생긴다.
코드
//1992번 쿼드트리.java
package com.ssafy;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 쿼드트리_1992 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static StringBuilder sb = new StringBuilder();
static int N;
static int[][] video;
public static void main(String[] args) throws NumberFormatException, IOException {
N = Integer.parseInt(br.readLine());
video = new int[N][N];
String line;
for(int i=0;i<N;i++) {
line = br.readLine();
for(int j=0;j<N;j++) {
video[i][j] = line.charAt(j)-'0';
}
}
quadtree(video);
System.out.println(sb.toString());
}
public static void quadtree(int[][] video) {
int check=0;
for(int i=0;i<video.length;i++) {
for(int j=0;j<video[i].length;j++) {
check+=video[i][j];
}
}
if(check==0)sb.append(0);
else if(check==video.length*video.length)sb.append(1);
else {
int arr[][][] = new int[4][video.length/2][video.length/2];
for(int i=0;i<video.length/2;i++) {
for(int j=0;j<video.length/2;j++) {
arr[0][i][j] = video[i][j];
}
}
for(int i=0;i<video.length/2;i++) {
for(int j=video.length/2;j<video.length;j++) {
arr[1][i][j%(video.length/2)] = video[i][j];
}
}
for(int i=video.length/2;i<video.length;i++) {
for(int j=0;j<video.length/2;j++) {
arr[2][i%(video.length/2)][j] = video[i][j];
}
}
for(int i=video.length/2;i<video.length;i++) {
for(int j=video.length/2;j<video.length;j++) {
arr[3][i%(video.length/2)][j%(video.length/2)] = video[i][j];
}
}
sb.append("(");
quadtree(arr[0]);
quadtree(arr[1]);
quadtree(arr[2]);
quadtree(arr[3]);
sb.append(")");
}
}
}
728x90
반응형
SMALL
'Problem Solving > 백준BOJ' 카테고리의 다른 글
[백준BOJ] 3109번 빵집.java (0) | 2021.08.19 |
---|---|
[백준BOJ] 6603번 로또.java (0) | 2021.08.18 |
[백준BOJ] 1865번 웜홀.py (0) | 2021.08.16 |
[백준BOJ] 15649번 N과 M(1).java (0) | 2021.08.16 |
[백준BOJ] 2217번 로프.java (0) | 2021.08.16 |