(
, 나오는 부분은 )
를 넣어줘야 한다.newSize = size / 2
와 같은 꼴로 반복 될 것이다.import java.io.*;
public class Main {
public static StringBuilder sb = new StringBuilder();
public static int[][] grid;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
grid = new int[n][n];
for (int i = 0; i < n; i++) {
String str = br.readLine();
for (int j = 0; j < n; j++) {
grid[i][j] = str.charAt(j) - '0';
}
}
solution(0, 0, n);
System.out.println(sb);
}
public static void solution(int x, int y, int size) {
if (check(x, y, size)) {
sb.append(grid[x][y]);
return;
}
int newSize = size / 2;
sb.append('(');
solution(x, y, newSize);
solution(x, y + newSize, newSize);
solution(x + newSize, y, newSize);
solution(x + newSize, y + newSize, newSize);
sb.append(')');
}
public static boolean check(int x, int y, int size) {
int value = grid[x][y];
for (int i = x; i < x + size; i++) {
for (int j = y; j < y + size; j++) {
if (value != grid[i][j]) return false;
}
}
return true;
}
}
grid[x][y]
는 x, y의 좌표라 생각하여 check()
는 이 좌표를 출발점으로 size만큼 2중 for문으로 완전탐색을 하며 색깔이 모두 같은지를 판단한다.
solution()
으로 재귀를 하는 부분은 앞서 언급했던 4방향에 대한 재귀를 수행하는 부분이다. 이런 패턴을 잘 기억해두면 재귀/분할정복에 대해 어느정도 감이 잡혀갈 것이라 생각한다.