알고리즘

[Lv_2] 쿼드압축 후 세기

deedee2 2023. 8. 16. 20:30
728x90

모든 배열의 값이 같은 경우를 처리하는 것이 까다로웠다.

import java.util.*;

class Solution {
    int[][] data = null;
    int zeroCnt = 0;
    int oneCnt = 0;
    
    public int[] solution(int[][] arr) {
        data = arr;
        
        // 모든 수가 같은 배열일 경우 체크
        Boolean isOneValue = true;
        int standard = data[0][0];
        for (int[] d : data) {
            for (int n : d) {
                if (n != standard) {
                    isOneValue = false;
                }
            }
        }
        
        if (isOneValue) {
            if (standard == 0) {
                zeroCnt += 1;
            } else {
                oneCnt += 1;
            }
        } else {
            quadCompress(0, 0, data.length / 2);
        }
        
        return new int[] { zeroCnt, oneCnt };
    }
    
    public void quadCompress(int r, int c, int range) {
        if (range >= 1) {
        
            int[] cols = { 0, range, 0,     range };
            int[] rows = { 0, 0,     range, range };
            
            
            for (int count = 0; count < 4; count++) {
                int row = r + rows[count];
                int col = c + cols[count]; 

                int standard = data[row][col];
                Boolean flag = true;

                for (int i = 0; i < range; i++) {
                    for (int j = 0; j < range; j++) {
                        if (standard != data[row + i][col + j]) {
                            flag = false;
                        }
                    }
                }
                
                if (!flag) {
                	// 탐색결과 압축될 수 없다면 range를 좁혀 재실행
          			// 단 더이상 압축될 수 없는 1일때는 압축을 중지하고 갯수세기
                    if (range == 1) {
                        for (int i = 0; i < range; i++) {
                            for (int j = 0; j < range; j++) {
                                int value = data[row + i][col + j];
                                if (value == 0) {
                                    zeroCnt += 1;
                                } else {
                                    oneCnt += 1;
                                }
                            }
                        }
                    } else {
                        quadCompress(row, col, range / 2);
                    }
                } else {
                	// 압축될 수 있다면 해당 범위만큼은 1개로 세기
                    if (standard == 0) {
                        zeroCnt += 1;
                    } else {
                        oneCnt += 1;
                    }
                }
            }
        }
    }
}

코딩테스트 연습 - 쿼드압축 후 개수 세기 | 프로그래머스 스쿨 (programmers.co.kr)