알고리즘
[BOJ] 1992 쿼드트리 - Java
Hzim
2023. 2. 11. 21:04
문제
https://www.acmicpc.net/problem/1992
1992번: 쿼드트리
첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또
www.acmicpc.net
풀이
- 영상의 크기를 나타내는 N의 크기만큼 검사하여 특정 구역의 모든 숫자가 같다면 그대로 압축
- 숫자가 같지 않다면 구역을 4등분하여 다시 검사 후 압축 진행
- 새로운 구역을 나눠서 검사할 때 ( 괄호 넣어주고, 검사 후 ) 괄호 넣어주기
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int[][] map;
static StringBuilder sb;
public static void zone(int r, int c, int div){
if(check(r,c,div)){
if(map[r][c] == 1) sb.append(1);
else sb.append(0);
return;
}
int n_div = div/2;
sb.append("(");
zone(r,c,n_div);
zone(r,c+n_div, n_div);
zone(r+n_div, c, n_div);
zone(r+n_div, c+n_div, n_div);
sb.append(")");
}
public static boolean check(int r, int c, int div){
int first = map[r][c];
for(int i=r; i<r+div; i++){
for(int j=c; j<c+div; j++){
if(map[i][j] != first) return false;
}
}
return true;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
sb = new StringBuilder();
int n= Integer.parseInt(br.readLine());
map = new int[n][n];
for(int i=0; i<n; i++){
String s = br.readLine();
for(int j=0; j<n; j++){
map[i][j] = s.charAt(j)-'0';
}
}
zone(0,0,n);
System.out.println(sb);
}
}
- 특정 구역의 행과 열 좌표를 주고, 구역의 모든 숫자가 같은지 검사
- 같다면 그대로 압축, 같지 않다면 구역 나누기
- 검사 순서는 2,1,3,4사분면 순서로 진행하기