PS/프로그래머스

[프로그래머스 - 68936] 쿼드압축 후 개수 세기

이세형 2020. 11. 5. 13:18

- 문제설명

- 풀이코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <string>
#include <vector>
#include <iostream>
 
//https://programmers.co.kr/learn/courses/30/lessons/68936
 
using namespace std;
 
 
int count_1;
int count_0;
 
void compress(vector<vector<int>> &arr, int y,int x, int n){
 
    int sum = 0;
    for(int i=y;i<y+n;i++){
        for(int j=x;j<x+n;j++){
            sum +=arr[i][j];
        }
    }
    if(sum==0){
        count_0++;
        return;
    }
    if(sum==n*n){
        count_1++;
        return;
    }
    compress(arr,y,x,n/2);
    compress(arr,y,n/2+x,n/2);
    compress(arr,y+n/2,x,n/2);
    compress(arr,y+n/2,x+n/2,n/2);
    
}
vector<int> solution(vector<vector<int>> arr) {
    
    vector<int> answer;
    compress(arr,0,0,arr.size());
    answer.push_back(count_0);
    answer.push_back(count_1);
    return answer;
    
}
cs

 

- 시간복잡도

 

O(2^(2n)) 2^(2n)은 배열의 크기이다. 최악의 경우가 모든 원소가 개별적으로 압축이 될 때이므로.

이문제에서 최대 배열의 크기는 1024*1024 이다. 즉 n이 0부터 5까지 이므로 여유롭게 풀리는 문제이다.

 

- 남의 풀이와 비교

 

다른 사람들의 코드를 보니 압축이 되는지 안되는 지에 대한 부분을 함수로 따로 빼서 작성한 코드들이 있었는데 그렇게 작성하는 것이 훨씬 깔끔해 보였다.

또 압축이 되는지에 대한 판단을 할때 나의 경우에는 sum을 해서 0이면 0으로 압축이되고 sum이 n(현재크기)의 제곱이 되면 1로 압축이 된다고 판단을 했는데, 다른 사람의 풀이는 맨처음 값을 두고 그 값과 다른 값이 나오는지, 아닌지로 판단한 코드가 있었다.

 

- Reference

programmers.co.kr/learn/courses/30/lessons/68936