[Programmers] 쿼드압축 후 개수 세기

Date:

[Programmers] 쿼드압축 후 개수 세기

Problem URL : 쿼드압축 후 개수 세기

풀이 1 (작은 사각형부터 큰 사각형 순으로 dfs)

#include <string>
#include <vector>
#include <iostream>

using namespace std;
int one = 0;
int zero;
int n;

void dfs(vector<vector<int>> &arr, int size) {
    if(n == size) {
        return;
    }
    for(int i = 0; i < n / size; i = i + 2) {
        for(int j = 0; j < n / size; j = j + 2) {
            if(arr[i][j] == 1 && arr[i][j + 1] == 1 && arr[i + 1][j] == 1 && arr[i + 1][j + 1] == 1){
                arr[i/2][j/2] = 1;
                one = one - 3;
            }else if(arr[i][j] == 0 && arr[i][j + 1] == 0 && arr[i + 1][j] == 0 && arr[i + 1][j + 1] == 0){
                arr[i/2][j/2] = 0;
                zero = zero - 3;
            }else {
                arr[i/2][j/2] = 2;
            }
        }
    }
    dfs(arr, 2 * size);
}

vector<int> solution(vector<vector<int>> arr) {
    vector<int> answer;
    n = arr.size();
    
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if(arr[i][j] == 1) {
                one++;
            }
        }
    }
    zero = n * n - one;
    if(zero != 0 && one != 0){
        dfs(arr,1);
        answer.push_back(zero);
        answer.push_back(one);
    }else {
        if(one == 0) {
            answer.push_back(1);
            answer.push_back(0);
        }else {
            answer.push_back(0);
            answer.push_back(1);
        }
    }
    return answer;
}

풀이 2 (큰 사각형부터 작은 사각형 순으로 dfs)

#include <string>
#include <vector>
#include <iostream>

using namespace std;
int one = 0;
int zero;
int n;

void dfs(vector<vector<int>> &arr, int x, int y, int size) {
    if(size <= 1) {
        return;
    }
    int tmp = arr[x][y];
    bool zip = true;
    for(int i = x; i < x + size; i++) {
        for(int j = y; j < y + size; j++) {
            if(tmp != arr[i][j]) {
                zip = false;
                break;
            }
        }
    }
    if(zip) {
        if(tmp == 0) {
            zero = zero - size*size + 1;
        } else {
            one = one - size*size + 1;
        }
    }else{
        dfs(arr, x, y, size / 2);
        dfs(arr, x, y + size / 2, size / 2);
        dfs(arr, x + size / 2, y, size / 2);
        dfs(arr, x + size / 2, y + size / 2, size / 2);
    }
}

vector<int> solution(vector<vector<int>> arr) {
    vector<int> answer;
    n = arr.size();
    
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if(arr[i][j] == 1) {
                one++;
            }
        }
    }
    zero = n * n - one;
    if(zero != 0 && one != 0) {
        dfs(arr, 0, 0, n / 2);
        dfs(arr, 0, n / 2, n / 2);
        dfs(arr, n / 2, 0, n / 2);
        dfs(arr, n / 2, n / 2, n / 2);
        answer.push_back(zero);
        answer.push_back(one);
    }else {
        if(one == 0) {
            answer.push_back(1);
            answer.push_back(0);
        }else {
            answer.push_back(0);
            answer.push_back(1);
        }
    }
    
    return answer;
}

Comments

풀이 1이 풀이 2보다 효율은 조금 더 좋지만, 구현은 2가 훨씬 쉽다!

댓글