Algorithm/분할정복

BOJ#1992 쿼드트리

밤이2209 2017. 8. 25. 16:16

BOJ#1992 쿼드트리


* 문제



* 풀이

- 분할정복을 사용하는 알고리즘들은 대개 3가지의 구성 요소를 갖고 있습니다.

 1. 문제를 더 작은 문제로 분할하는 과정(divide)
 2. 각 문제에 대해 구한 답을 원래 문제에 대한 답으로 병합하는 과정(merge)
 3. 더 이상 답을 분할하지 않고 곧장 풀 수 있는 매우 작은 문제(base case)
(출처 : 알고리즘 문제 해결 전략)


위 해결 전략을 염두하고 문제를 풀어보았습니다.
쉬운 문제이므로 풀이는 생략하겠습니다.




* 나의 코드

https://github.com/stack07142/BOJ/blob/master/BOJ%231992/src/Main.java


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

static char[][] map = new char[64][64];

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int N = Integer.parseInt(br.readLine());

for (int i = 0; i < N; i++) {

String inputLine = br.readLine();
for (int j = 0; j < N; j++) {

map[i][j] = inputLine.charAt(j);
}
}

System.out.println(solve(N, map, 0, 0));
}

static String solve(int N, char[][] map, int row, int col) {

// Base Case
if (N == 1) {

return "" + map[row][col];
} else {

if (isAvailableCompression(N, map, row, col)) {

return "" + map[row][col];
}
// divide & merge
else {

String ret = "(";

for (int i = 0; i < 4; i++) {

int newRow = row;
int newCol = col;

switch (i) {

case 0:
break;

case 1:

newCol += N / 2;
break;

case 2:

newRow += N / 2;
break;

case 3:

newRow += N / 2;
newCol += N / 2;
break;
}
ret += solve(N / 2, map, newRow, newCol);
}

return ret + ")";
}
}
}

static boolean isAvailableCompression(int N, char[][] map, int row, int col) {

char data = map[row][col];

for (int i = row; i < row + N; i++) {
for (int j = col; j < col + N; j++) {

if (data != map[i][j]) {

return false;
}
}
}

return true;
}
}


'Algorithm > 분할정복' 카테고리의 다른 글

BOJ#1074 Z  (0) 2017.08.24
BOJ#11729 하노이 탑 이동 순서  (0) 2017.05.09