프로그래머스/2레벨

쿼드압축 후 개수 세기/C++

Koalitsiya 2023. 2. 22. 17:50
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 조건

  • 정사각형 영역에서 영역 내부의 수가 모두 같은 값이라면 해당 영역을 수 하나로 압축시킨다.
  • 그렇지 않다면 해당 영역을 같은 크기의 정사각형 영역 4개로 나누어 위의 조건을 수행한다.

풀이방법

1. 정사각형 영역을 모두 더했을 때 값이 0이라면 해당 영역 내부의 값들이 모두 0이므로 zero++

2. 정사각형 영역을 모두 더했을 때 값이 size*size라면 해당 영역 내부의 값들이 모두 1이므로 one++

3. 둘 다 아니라면 현재 영역을 같은 크기의 정사각형 영역 4개로 나누어 DFS 수행 

4. DFS가 종료된 후 answer 리턴

#include <string>
#include <vector>

using namespace std;

void DFS(vector<vector<int>>& arr, int x, int y, int size, int& zero, int& one) {
    if(size == 1) {
        if(arr[x][y] == 1) one++;
        else zero++;
        return;
    }
    
    int sum = 0;
    
    for(int i = 0; i < size; i++) {
        for(int j = 0; j < size; j++) 
            sum += arr[x + i][y + j];
    }
    
    if(sum == 0) {
        zero++;
        return;
    }
    else if(sum == size * size) {
        one++;
        return;
    }
    else {
        DFS(arr, x, y, size / 2, zero, one);
        DFS(arr, x, y + size / 2, size / 2, zero, one);
        DFS(arr, x + size / 2, y, size / 2, zero, one);
        DFS(arr, x + size / 2, y + size / 2, size / 2, zero, one);
    }
}

vector<int> solution(vector<vector<int>> arr) {
    vector<int> answer(2,0);
    
    DFS(arr, 0, 0, arr.size(), answer[0], answer[1]);
    
    return answer;
}