kakasoo

[node.js] 쿼드 압축 후 개수 세기 ( 프로그래머스 레벨2 ) 본문

프로그래밍/알고리즘 풀이

[node.js] 쿼드 압축 후 개수 세기 ( 프로그래머스 레벨2 )

카카수(kakasoo) 2021. 7. 1. 17:56
반응형
const checkArr = (arr) => {
    const firstValue = arr[0][0];
    for (let i = 0; i < arr.length; i++) {
        for (let j = 0; j < arr.length; j++) {
            if (arr[i][j] !== firstValue) {
                return { done: false };
            }
        }
    }
    return { done: true, value: firstValue };
};

const makeQuarter = (arr) => {
    const upArr = arr.splice(0, arr.length / 2);
    const downArr = arr;

    const upLeftArr = upArr.map((el) => el.splice(0, el.length / 2));
    const upRightArr = upArr;
    const downLeftArr = downArr.map((el) => el.splice(0, el.length / 2));
    const downRightArr = downArr;

    return [upLeftArr, upRightArr, downRightArr, downLeftArr].map((el) => {
        let cur;
        if ((cur = checkArr(el)).done) {
            return cur.value;
        } else return makeQuarter(el);
    });
};

const solution = (arr) => {
    if (checkArr(arr).done) {
        const answer = [0, 0];
        answer[arr[0][0]]++;
        return answer;
    }
    const quarters = makeQuarter(arr);
    const board = quarters.flat(Infinity);

    const zeroes = board.filter((el) => el === 0).length;
    const ones = board.filter((el) => el === 1).length;

    return [zeroes, ones];
};

내가 생각한 로직은,

  1. 일단 4등분을 하는 로직을 만든다.
    • 4등분을 하고 나면 그 배열들을 순회하며, 전부 0 또는 1로 이루어져 있는지를 체크한다.
      • 만약 전부 1 또는 0으로 된 경우, 1 또는 0을 반환한다.
      • 만약 전부 하나의 값으로 되어 있지 않다면 재귀적으로 4등분하는 로직을 호출한다.
  2. 위의 체크 로직을 구현한다.
  3. 돌아온 값은 예제의 그림처럼 되어 있을 테니, flatten 하게 만든 다음 각각 0과 1의 개수를 세서 배열에 담아 반환한다.
반응형