๐ [๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ ํ์ด] Q.1992 ์ฟผ๋ํธ๋ฆฌ ๋ฌธ์ ํ์ด - java
๐ ๋ฌธ์
https://www.acmicpc.net/problem/1992
ํ๋ฐฑ ์์์ ์์ถํ์ฌ ํํํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์ฟผ๋ ํธ๋ฆฌ(Quad Tree)๋ผ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ํฐ ์ ์ ๋ํ๋ด๋ 0๊ณผ ๊ฒ์ ์ ์ ๋ํ๋ด๋ 1๋ก๋ง ์ด๋ฃจ์ด์ง ์์(2์ฐจ์ ๋ฐฐ์ด)์์ ๊ฐ์ ์ซ์์ ์ ๋ค์ด ํ ๊ณณ์ ๋ง์ด ๋ชฐ๋ ค์์ผ๋ฉด, ์ฟผ๋ ํธ๋ฆฌ์์๋ ์ด๋ฅผ ์์ถํ์ฌ ๊ฐ๋จํ ํํํ ์ ์๋ค.
์ฃผ์ด์ง ์์์ด ๋ชจ๋ 0์ผ๋ก๋ง ๋์ด ์์ผ๋ฉด ์์ถ ๊ฒฐ๊ณผ๋ โ0โ์ด ๋๊ณ , ๋ชจ๋ 1๋ก๋ง ๋์ด ์์ผ๋ฉด ์์ถ ๊ฒฐ๊ณผ๋ โ1โ์ด ๋๋ค. ๋ง์ฝ 0๊ณผ 1์ด ์์ฌ ์์ผ๋ฉด ์ ์ฒด๋ฅผ ํ ๋ฒ์ ๋ํ๋ด์ง๋ฅผ ๋ชปํ๊ณ , ์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ผ์ชฝ ์๋, ์ค๋ฅธ์ชฝ ์๋, ์ด๋ ๊ฒ 4๊ฐ์ ์์์ผ๋ก ๋๋์ด ์์ถํ๊ฒ ๋๋ฉฐ, ์ด 4๊ฐ์ ์์ญ์ ์์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ฐจ๋ก๋๋ก ๊ดํธ ์์ ๋ฌถ์ด์ ํํํ๋ค
์ ๊ทธ๋ฆผ์์ ์ผ์ชฝ์ ์์์ ์ค๋ฅธ์ชฝ์ ๋ฐฐ์ด๊ณผ ๊ฐ์ด ์ซ์๋ก ์ฃผ์ด์ง๋ฉฐ, ์ด ์์์ ์ฟผ๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ์์ถํ๋ฉด โ(0(0011)(0(0111)01)1)โ๋ก ํํ๋๋ค. N รN ํฌ๊ธฐ์ ์์์ด ์ฃผ์ด์ง ๋, ์ด ์์์ ์์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐ ์ ๊ทผ๋ฒ
Q.1992 ์ฟผ๋ํธ๋ฆฌ ๋ฌธ์ ๋ฌธ์ ์ ๋๋ค.
Q.2630 ์์ข ์ด ๋ง๋ค๊ธฐ ๋ฌธ์ ์ ์๋นํ ์ ์ฌํ ๋ฌธ์ ์ ๋๋ค.
์ฟผ๋ํธ๋ฆฌ ๋ฌธ์ ์ญ์ ์ฃผ์ด์ง๋ ์์์ด ๋ชจ๋ 0์ด๊ฑฐ๋ 1์ด์ฌ๋ง ์์ถ์ด ๊ฐ๋ฅํฉ๋๋ค.
์์ข ์ด ๋ง๋ค๊ธฐ ๋ฌธ์ ์ ์ ์ฌํ๊ฒ ์ฃผ์ด์ง ์์์ด ๋ชจ๋ 0์ด๊ฑฐ๋ 1์ด ์๋๋ผ๋ฉด
๊ฐ๋ก, ์ธ๋ก๋ฅผ ๋ชจ๋ ๊ฐ๋ก๋ก ๋๋ 4๋ฑ๋ถ์ ๋ฐ๋ณตํด์ค๋๋ค.
๋ถํ ์ ๋ณต๋ฒ์ ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์ด ํ ์ ์์ต๋๋ค.
์์ข ์ด ๋ง๋ค๊ธฐ์ ์ ์ฌํ๊ฒ ์ฃผ์ด์ง ์์์ด ๋ชจ๋ 0์ด๊ฑฐ๋ 1์ผ๋ ๊น์ง
์ฌ๊ท๋ฅผ ํตํด 4๋ฑ๋ถ์ผ๋ก ๋๋๋ค๊ฐ ์กฐ๊ฑด์ ๋ง๋๋ค๋ฉด ์์ถ์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์์ถ์ ํํ์ ๋ฌธ์์ด๋ก ํด์ผํ๊ธฐ ๋๋ฌธ์
StringBuilder ๋ฅผ ์ด์ฉํ์ฌ
์ฌ๊ท์ ๋ค์ด๊ฐ ๋ โ(โ๋ฅผ ์ถ๊ฐํด์ฃผ๊ณ
์ฌ๊ท๊ฐ ๋๋๊ณ ์์ถ์ด ์๋ฃ๊ฐ ๋ ๋๋ง๋ค โ)โ๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
๋ํ ๋๋ ์ง ๋ถ๋ถ ์์์ด 0 ์ด๊ฑฐ๋ 1์ด๋ผ๋ฉด ํด๋น ์ซ์๋ฅผ ์ถ๊ฐํด์
์์ถ์ ํํ์ ๋ฌธ์์ด๋ก ํํํ ์ ์์ต๋๋ค.
๐ป ์ฝ๋
package problem.divide_conquer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main_1992 {
static int n;
static int board[][];
static StringBuilder sb;
public static void main(String[] args) throws IOException {
input();
solve(0, 0, n);
System.out.println(sb.toString());
}
public static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
sb = new StringBuilder();
n = Integer.parseInt(br.readLine());
board = new int[n][n];
for (int i = 0; i < n; i++) {
String[] input = br.readLine().split("");
for (int j = 0; j < n; j++) {
board[i][j] = Integer.parseInt(input[j]);
}
}
br.close();
}
public static void solve(int startX, int startY, int len) {
if (check(startX, startY, len)) {
if (board[startY][startX] == 1) {
sb.append("1");
} else {
sb.append("0");
}
} else {
int length = len / 2;
sb.append("(");
solve(startX, startY, length);
solve(startX + length, startY, length);
solve(startX, startY + length, length);
solve(startX + length, startY + length, length);
sb.append(")");
}
}
public static boolean check(int startX, int startY, int len) {
int color = board[startY][startX];
for (int i = startY; i < startY + len; i++) {
for (int j = startX; j < startX + len; j++) {
if (color != board[i][j]) {
return false;
}
}
}
return true;
}
}