๐ ๋ฌธ์
๐ ์์ด๋์ด
์ฌ๊ฐํ์ ์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ผ์ชฝ ์๋, ์ค๋ฅธ์ชฝ ์๋๋ก ๋ฌถ์ ํ์ ํด๋น ์์ญ์ด ๋ชจ๋ ๊ฐ์ ์์ผ๋ก ์น ํด์ ธ์๋ค๋ฉด ์ซ์๋ฅผ ์ ๋ ฅํ๊ณ ์น ํด์ ธ ์์ง ์๋ค๋ฉด ๋ค์ ํ๋ถ 4๋ฑ๋ถ ๋ถํ ํ์ฌ ํ์์ญ์ด ๋ชจ๋ ๊ฐ์ ์์ด ๋ ๋๊น์ง ์งํํ๋ฉฐ ์์ญ์ ๊ฐ์ ๊ตฌํด๋๊ฐ๋ค.
์์ ์ ๋ ฅ
8
11110000
11110000
00011100
00011100
11110000
11110000
11110011
11110011
์์ ์ถ๋ ฅ
((110(0101))(0010)1(0001))
๐ ํ์ด
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
private char[][] image;
private StringBuilder quadTreeBuilder;
public static void main(String[] args) throws IOException {
new Main().solution();
}
public void solution() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
image = new char[n][];
for (int i = 0; i < n; i++) {
image[i] = br.readLine().toCharArray();
}
quadTreeBuilder = new StringBuilder();
compressQuad(n, 0, 0);
System.out.println(quadTreeBuilder);
}
private void compressQuad(
//n : ์ ์ฌ๊ฐํ ํ๋ณ์ ๊ธธ์ด
int n,
//x: ์ ์ฌ๊ฐํ์ ์์ x index
int x,
//y: ์ ์ฌ๊ฐํ์ ์์ y index
int y) {
//ํ์ฌ ์ฌ๊ฐํ์ด ๋ชจ๋ ๊ฐ์ ์์ผ๋ก ์น ํด์ ธ ์๋ค๋ฉด
if (isSuccess(n, x, y)) {
quadTreeBuilder.append(image[x][y]);
} else {
//4๋ฑ๋ถํ์ฌ ์ฌ๊ทํธ์ถํ๋ค.
quadTreeBuilder.append("(");
int half = n / 2;
compressQuad(half, x, y); //์ผ์ชฝ ์๋จ
compressQuad(half, x, y + half);//์ค๋ฅธ์ชฝ ์๋จ
compressQuad(half, x + half, y); //์ผ์ชฝ ํ๋จ
compressQuad(half, x + half, y + half); //์ค๋ฅธ์ชฝ ํ๋จ.
quadTreeBuilder.append(")");
}
}
//์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ํ์ธํ๋ ๋ฉ์๋
private boolean isSuccess(int n, int x, int y) {
char init = image[x][y];
for (int i = x; i < x + n; i++) {
for (int j = y; j < y + n; j++) {
if (image[i][j] != init) return false;
}
}
return true;
}
}