알고리즘/BOJ
[BOJ] 1992. 쿼드트리
재담
2022. 2. 22. 01:25
문제 원본 : https://www.acmicpc.net/problem/1992
1992번: 쿼드트리
첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또
www.acmicpc.net
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
char[][] chars = new char[n][n];
for (int i = 0; i < n; ++i) {
String s = scanner.next();
chars[i] = s.toCharArray();
}
System.out.println(QuadTree(chars, 0, 0, n - 1, n - 1));
}
public static String QuadTree(char[][] chars, int lr, int lc, int rr, int rc) {
if (isZeroOrOne(chars, '1', lr, lc, rr, rc)) {
return "1";
} else if (isZeroOrOne(chars, '0', lr, lc, rr, rc)) {
return "0";
} else {
String ret = "(";
ret += QuadTree(chars, lr, lc, (lr + rr) / 2, (lc + rc) / 2);
ret += QuadTree(chars, lr, (lc + rc) / 2 + 1, (lr + rr) / 2, rc);
ret += QuadTree(chars, (lr + rr) / 2 + 1, lc, rr, (lc + rc) / 2);
ret += QuadTree(chars, (lr + rr) / 2 + 1, (lc + rc) / 2 + 1, rr, rc);
ret += ")";
return ret;
}
}
public static boolean isZeroOrOne(char[][] chars, char c, int lr, int lc, int rr, int rc) {
for (int i = lr; i <= rr; ++i) {
for (int j = lc; j <= rc; ++j) {
if (chars[i][j] != c) {
return false;
}
}
}
return true;
}
}
- 전형적인 분할 정복 문제
- 직관적이라 재귀로 쉽게 풀 수 있다.