Game Develop

[Algorithm] Programmers :: 쿼드압축 후 개수 세기 본문

Algorithm/Programmers

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

MaxLevel 2023. 6. 3. 23:06

https://school.programmers.co.kr/learn/courses/30/lessons/68936

 

프로그래머스

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

programmers.co.kr

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
struct Node
{
    int y;
    int x;
 
    Node& operator+=(const Node& a)
    {
        this->+= a.y;
        this->+= a.x;
 
        return *this;
    }
};
 
Node divide(Node leftTop, int n, vector<vector<int>>& arr)
{
    if (n == 1)
    {
        if (arr[leftTop.y][leftTop.x] == 0return { 1,0 };
        else return { 0,1 };
    }
 
    int standard = arr[leftTop.y][leftTop.x];
    bool isBreak = false;
 
    for (int i = leftTop.y; i < leftTop.y + n; ++i)
    {
        for (int j = leftTop.x; j < leftTop.x + n; ++j)
        {
            if (arr[i][j] != standard)
            {
                isBreak = true;
                break;
            }
        }
 
        if (isBreak) break;
    }
 
    if (!isBreak)
    {
        if (standard == 0return { 1,0 };
        else return { 0,1 };
    }
 
    Node result = { 0,0 };
 
    result += divide(leftTop, n / 2, arr); // 좌측 상단
    result += divide({ leftTop.y ,leftTop.x + n / 2 }, n / 2, arr); // 우측 상단
    result += divide({ leftTop.y + n / 2, leftTop.x }, n / 2, arr); // 좌측 하단
    result += divide({ leftTop.y + n / 2, leftTop.x + n / 2 }, n / 2, arr); // 우측 하단
 
    return result;
}
 
 
vector<int> solution(vector<vector<int>> arr)
{
    vector<int> answer;
 
    Node temp = divide({ 0,0 }, arr.size(), arr);
 
    return answer = { temp.y, temp.x };
}
cs

재귀를 통해 각 사분면을 계속 파고들어 개수를 구하면 되는 문제이다.

0의 개수랑 1의 개수를 같이 리턴해야해서 연산자오버로딩해서 좀 더 깔끔하게 해봤다.