프로그래머스_C#/Level_2

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

최애뎡 2021. 11. 9. 00:01
728x90
반응형

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

 

코딩테스트 연습 - 쿼드압축 후 개수 세기

[[1,1,0,0],[1,0,0,0],[1,0,0,1],[1,1,1,1]] [4,9] [[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]

programmers.co.kr

public class Solution {
    int[] answer = new int[] {0, 0};
    
    public int[] solution(int[,] arr) {
        QuadtreeCompress(arr, 0, 0, arr.GetLength(0));
        
        return answer;
    }
    
    void QuadtreeCompress(int[,] arr, int x_S, int y_S, int length)
    {
        bool zero = true, one = true;
        
        for (int i = x_S; i < x_S + length; i++)
            for (int j = y_S; j < y_S + length; j++)
            {
                if (arr[i, j] == 0) one = false;
                if (arr[i, j] == 1) zero = false;
            }
        
        if (zero)
            answer[0] += 1;
        
        if (one)
            answer[1] += 1;
        
        if (zero || one)
            return;
        
        QuadtreeCompress (arr, x_S, y_S, length / 2);
        QuadtreeCompress (arr, x_S, y_S + length / 2, length / 2);
        QuadtreeCompress (arr, x_S + length / 2, y_S, length / 2);
        QuadtreeCompress (arr, x_S + length / 2, y_S + length / 2, length / 2);
    }
}

배열 잘 들고 와서 0이나 1만 존재하는지 확인 후 0이나 1만 존재하면 값을 더하고 return,

0과 1이 공존하면 4분할 해주면 된다.

(4분할의 경우 재귀 함수를 사용하면 되고 이중 for문을 구성할 때 각 범위를 잘 찾을 수 있도록만)

* 핵심은 재귀 함수(범위는 어차피 반씩 줄어드니까 반씩 줄이면 되고),

분할을 했을 때의 범위를 이쁘게 찾도록 설정(시작 index가 반으로 나눈 length의 +방향일 경우 기존 length로만 주어지면 당연히 안되고 기존 범위에 + 해야 함)

반응형