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

IT공부중·2021년 1월 4일
0

알고리즘

목록 보기
45/49

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

function quad(array, size, countArray, start) {
    const first = array[start[0]][start[1]]; // 시작 지점의 값
    if(size === 1) { // size가 1이면 마지막이다. first 값에 따라서 countArray의 값을 증가시켜준다.
        first === 0 ? countArray[0] += 1 : countArray[1] += 1;
        return;
    }
    
    const half = size / 2; // 정사각형의 절반 가로, 세로 동일
    let keep = true;
    
    for (let i = start[0]; i < start[0] + size; i++) {
        for(let j = start[1]; j < start[1] + size; j++) { // 모든 값이 다 같은지 확인한다. 하나라도 다르면 keep을 false로 변경
            if(first !== array[i][j]) {
                keep = false;
                break;
            }
        }
        if(!keep) break;
    }
    // keep이 true일 경우 모두가 다 같다는 뜻이므로, 하나만 확인하여 증가시켜 주면 된다. 그리고 안에 더 확인할 필요가 없으니 return
    if(keep) {
        first === 0 ? countArray[0]++ : countArray[1]++ ;
        return;
    }
    // keep이 false 일 경우 4등분하여 다시 해주면 된다.
    quad(array, half, countArray, start);
    quad(array, half, countArray, [start[0], start[1]+half]);
    quad(array, half, countArray, [start[0] + half, start[1]]);
    quad(array, half, countArray, [start[0] + half, start[1] + half]);
    return;
}

function solution(arr) {
    const countArray = [0, 0];
    const size = arr.length;
    quad(arr, size, countArray, [0, 0]);
    return countArray;
}

분할 정복 기법을 사용해서 재귀적으로 풀면 된다. 정사각형이기 때문에 반으로 딱 나눠지고 그것을 조건에 따라 4등분 하여 다시 똑같이 진행해주면 된다.

profile
3년차 프론트엔드 개발자 문건우입니다.

0개의 댓글