반응형
https://www.acmicpc.net/problem/1992
1992번: 쿼드트리
첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또
www.acmicpc.net
쿼드를 압축하는 방법은 간단하다.
가지고 있는 모든 수가 같을 때, 같은 수로 압축을 하면 된다.
예를 들어,
이렇게 주어졌을 때,
위 배열을 하나의 덩어리로 보았을 때 모든 수가 같지 않다. 그래서 압축을 할 수 없다.
압축을 하지 못하면 사이즈를 행, 열을 반으로 나누어 살펴본다.
이렇게 4개로 나누었을 때 각각을 하나의 덩어리로 보면 같은 수로만 이루어진 부분이 있다. 이는 압축을 해주면 된다.
이걸 나누어 지지 않을 때까지 반복하면
이렇게 압축해 줄 수 있다.
이걸 문제에서 요구하는 대로 (0(0011)(0(0111)01)1) 로 표현하면 된다.
왼쪽에서 오른쪽으로, 위에서 아래로 이동하면서 압축해주면된다.
import java.io.*;
public class Main {
static int[][] arr;
static int N;
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().split("");
for(int j=0;j<N;j++) {
arr[i][j]=Integer.parseInt(str[j]);
}
}
quad(0,0,N); //전체를 확인
System.out.println(sb);
}// main()
static void quad(int startX,int startY,int len) {
if(check(startX,startY,len)) { //모두 같은 수로 이루어져 있으면
sb.append(arr[startX][startY]); //해당 수를 출력
return;
}
len /=2; //사이즈를 점차 반으로 줄여가면서 확인
sb.append("("); //압축의 시작
//왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래 순으로
quad(startX,startY,len);
quad(startX,startY+len,len);
quad(startX+len,startY,len);
quad(startX+len,startY+len,len);
sb.append(")"); //압축의 끝
}//quad()
public static boolean check(int x, int y,int len){
for(int i=x;i<x+len;i++){
for(int j=y;j<y+len;j++){
if(arr[x][y]!=arr[i][j]) return false;
}
}
return true;
}//check()
}// class Main
728x90
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[Java] 백준 11057 : 오르막 수 (0) | 2023.02.10 |
---|---|
[Java] 백준 7526 : 나이트의 이동 (0) | 2023.02.10 |
[Java] 백준 9465 : 스티커 (0) | 2023.02.09 |
[Java] 백준 2468 : 안전영역 (0) | 2023.02.08 |
[Java] 백준 11052 : 카드 구매하기 (0) | 2023.02.08 |
댓글