0과 1로되어있는 데이터를 쿼드트리로 압축하는 문제이다.
문제 해결 방법은 다양한데, 분할 정복으로 푼다는 점에선 모두 일치한다.
해결방법 중 하나는 그냥 전부 분할해서, 반환 받은 값이 모두 일치하면 하나로 출력하고, 다르면 나눠 출력하는 방법이 있고.
또 하나는 검사해 나가면서 하나라도 다른 값이 있으면 분할하는 방법이 있다.
나는 두 번째 방법으로 해결하였다. 밑은 이를 구현한 코드이다.
#include <cstdio> int N, input[64][64]; void quadTree(int x, int y, int size) { int cur = input[y][x]; bool flag = true; for (int i = y; (i< y + size) && flag; i++) for (int j = x; (j<x + size) && flag; j++) if (cur != input[i][j]) flag = false; //전부 일치했으면 초기 문자 출력 if (flag) printf("%d", cur); //아니면 4개로 분할한다. else { printf("("); quadTree(x, y, size / 2); quadTree(x + size / 2, y, size / 2); quadTree(x, y + size / 2, size / 2); quadTree(x + size / 2, y + size / 2, size / 2); printf(")"); } } int main() { scanf("%d", &N); for (int i = 0; i< N; i++) for (int j = 0; j < N; j++) scanf("%1d", &input[i][j]); quadTree(0, 0, N); }
'Algorithm > Problems' 카테고리의 다른 글
백준 - 10216 Count Circle Groups (0) | 2016.06.20 |
---|---|
백준 - 10215 Colored Bead Work (0) | 2016.06.20 |
백준 - 10215 Colored Bead Works (0) | 2016.05.25 |
백준 - 2800 괄호 제거 (1) | 2016.05.18 |
백준 - 11583 인경호의 징검다리 (0) | 2016.05.12 |