Coding Test/백준
[백준] 1992 쿼드트리 - 자바
lsh2613
2023. 8. 28. 02:13
https://www.acmicpc.net/problem/1992
1992번: 쿼드트리
첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또
www.acmicpc.net
문제 풀이
https://lsh2613.tistory.com/187 색종이 만들기 문제와 비슷한 풀이 방법으로 총 4사분면으로 분할하여 압축 가능 여부를 판단한다.
범위를 정확하게 나누고 해당 범위가 압축가능한지 여부만 잘 작성한다면 크게 어려움 없이 풀이 가능하다.
코드
package 백준;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class b1992 {
static int[][] board;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
board = new int[n+1][n+1];
StringTokenizer st;
for (int i = 1; i <= n; i++) {
st = new StringTokenizer(String.join(" ", br.readLine().split("")));
for (int j = 1; j <= n; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
quadTree(1, n, 1, n);
System.out.println(sb);
}
static void quadTree(int left, int right, int up, int down) {
if (canCompress(left, right, up, down)) {
sb.append(board[up][left]);
return;
}
int midW = (right + left) / 2;
int midH = (down + up) / 2;
sb.append('(');
// 왼쪽 위
quadTree(left, midW, up, midH);
// 오른쪽 위
quadTree(midW + 1, right, up, midH);
// 왼쪽 아래
quadTree(left, midW, midH + 1, down);
// 오른쪽 아래
quadTree(midW + 1, right, midH + 1, down);
sb.append(')');
}
static boolean canCompress(int left, int right, int up, int down) {
int firstValue = board[up][left]; // 첫 번째 숫자를 기준으로 설정합니다.
for (int i = up; i <= down; i++) {
for (int j = left; j <= right; j++) {
if (board[i][j] != firstValue) {
return false; // 다른 숫자가 하나라도 있으면 압축할 수 없습니다.
}
}
}
return true; // 모든 숫자가 같다면 압축할 수 있습니다.
}
}