Post

[프로그래머스/LV2] 쿼드압축후 개수 세기 - 재귀(Java)

쿼드압축후 개수 세기 문제를 Java로 해결한 풀이입니다. 재귀 알고리즘을 활용하여 2가지 풀이로 문제를 정의합니다.

[프로그래머스 월간 코드챌린지 시즌1] 쿼드압축 후 개수 세기

🙋‍♂️ 들어가며

0과 1로 이루어졌다. n^2 * n^2

압축할 특정영역 S가 존재하는데, 만약 S 내부의 모든 수가 같으면 한가지 수로 압축한다. -> 최종적으로 남은 0, 1 갯수를 저장한다

우선 N <= 10 으로

재귀를 통해 한변의 길이가 절반으로 줄어들기에 최종적으로 아래와 같이 될 것이다.

\[\frac{N}{2^k} = 1\]

따라서

\[N = 2^k\]

이므로

\[\log_2 N = k\]

시간복잡도를 N^2 * log N 으로 4분할하여 풀 수 있겠다는 생각이 들었다



아이디어

1
2
3
4
5
6
7
8
9
10
11
12
13
// 1. main
    // 1-1. 첫 시작 행, 열 = 0;
    // 1-2. 첫 길이 N
    // 1-3. quad_tree 함수

// 2. quad_tree 함수
    // 2-1. 격자 안의 값이 첫값과 다 같은지 확인
        // 2-1-a. 만약 1개라도 틀리면 false
    // 2-2. 만약 전부 같으면 arr[첫값]++ 후에 return

    // 2-3. 한개라도 틀려서 압축 못했을 시
    // -> 다음 행, 열 = 현재좌표로 갱신, 배열크기 -> 절반
    // 그리고 백트랙킹 각각(왼위, 오위, 왼아래, 오아래)


testcase

1
2
3
4
5
6
7
8
9
10
{
    {1,1,1,1,1,1,1,1},
    {0,1,1,1,1,1,1,1},
    {0,0,0,0,1,1,1,1},
    {0,1,0,0,1,1,1,1},
    {0,0,0,0,0,0,1,1},
    {0,0,0,0,0,0,0,1},
    {0,0,0,0,1,0,0,1},
    {0,0,0,0,1,1,1,1}
}

내 생각대로 [10, 15] 가 출력되었다



✅ 코드

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
65
class Solution {
    static int[] answer;
    
    public int[] solution(int[][] arr) {
        answer = new int[2];
        
        // 1. quad_tree
        int sr = 0;
        int sc = 0;
        int N = arr.length;
        quad_tree(sr, sc, arr, N);
        
        // 2. 결과값
        return answer;
    }
    
    
    
    // 3. quad_tree 함수
    static void quad_tree(int cr, int cc, int[][] arr, int N) {
        
        // 3-1-a. 격자 안의 값이 첫 값과 다 같은지 확인
        int point = arr[cr][cc];
        boolean is_all_same = true;
        for (int r = cr; r < cr + N; r++) {
            for (int c = cc; c < cc + N; c++) {
                // 3-1-b. 1개라도 틀리면 종료
                if (arr[r][c] != point) {
                    is_all_same = false;
                    break;
                }
            }
            // 3-1-c. 이미 1개라도 틀렸으면 break
            if (!is_all_same) break;
        }
        
        // 3-1-d. 만약 전부 같으면 -> 좌표 압축하고, 종료
        if (is_all_same) {
            answer[point]++;
            return;
        }
        
        
        // 3-2. 1개라도 틀려서 압축 못했을시
        int nr = cr;
        int nc = cc;
        int half = N / 2;
        
        // 3-3. 재귀
        
        // 3-3-a upper_left
        quad_tree(nr, nc, arr, half);
        
        // 3-3-b. upper_right
        quad_tree(nr, nc + half, arr, half);
        
        // 3-3-c. down_left
        quad_tree(nr + half, nc, arr, half);
        
        // 3-3-d. down_right
        quad_tree(nr + half, nc + half, arr, half);
    }
    
    
}
This post is licensed under CC BY 4.0 by the author.

Trending Tags

반갑습니다 무엇을 도와드릴까요?