궤도

[백준] 1992번 : 쿼드트리 본문

💻 현생/⛓ 알고리즘

[백준] 1992번 : 쿼드트리

영이오 2021. 3. 29. 16:31

문제

 


풀이

 

myunji.tistory.com/251

 

[백준] 2630번 : 색종이 만들기

문제 풀이 전형적인 분할 정복 문제다. divide and conquer라고 부르는데 문제의 수를 쪼개가며 푸는 것이다. 문제를 쪼갤 때는 보통 재귀함수를 많이 사용한다. 이 문제도 색종이의 색이 모두 같을

myunji.tistory.com

이 문제와 유사한 문제이다.

 

분할을 하는 지점에서 괄호를 입력한다는 걸 깨달으면 문제 자체는 금방 풀린다.


소스코드

 

#include <iostream>

using namespace std;

int video[64][64];

bool isSame(int size, int row, int col, int color) {
    for (int i = row; i < (size + row); i++) {
        for (int j = col; j < (size + col); j++) {
            if (video[i][j] != color)
                return false;
        }
    }
    return true;
}

void divide(int size, int row, int col) {
    int color = video[row][col];

    if (isSame(size, row, col, color)) { //압축 가능
        cout << color;
    } else { //분할
        cout << '(';
        int resize = size / 2;
        for (int i = 0; i <= resize; i += resize) {
            for (int j = 0; j <= resize; j += resize)
                divide(resize, row + i, col + j);
        }
        cout << ')';
    }
}

int main() {
    int N;
    string temp[64];

    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> temp[i];
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            video[i][j] = temp[i][j] - '0';
    }
    divide(N, 0, 0);
}

2630번 문제와 다른 부분만 설명하도록 하겠다.

 

    int N;
    string temp[64];

    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> temp[i];
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            video[i][j] = temp[i][j] - '0';
    }

2630번과 똑같이 입력을 처리했다가 오류가 발생해 살펴보니 이 문제는 띄어쓰기 없이 입력이 들어오고 있었다.

그래서 일단 string 형식의 temp 1차원 배열에 입력을 저장하고, 하나하나 쪼개어서 video 배열에 넣어줬다.

 

void divide(int size, int row, int col) {
    int color = video[row][col];

    if (isSame(size, row, col, color)) { //압축 가능
        cout << color;
    } else { //분할
        cout << '(';
        int resize = size / 2;
        for (int i = 0; i <= resize; i += resize) {
            for (int j = 0; j <= resize; j += resize)
                divide(resize, row + i, col + j);
        }
        cout << ')';
    }
}

divide 함수만 약간 달라졌다.

isSame 함수에서 모든 색이 동일함을 확인하면 그 색을 출력하고, 분할하는 과정에서 앞뒤로 괄호를 붙여줬다.

Comments