-
[Algorithm] 프로그래머스 - 쿼드압축 후 개수 세기(분할정복)Alogorithm 2022. 1. 5. 20:30반응형
프로그래머스 문제입니다.
[문제설명]
0과 1로 이루어진 2n x 2n 크기의 2차원 정수 배열 arr이 있습니다. 당신은 이 arr을 쿼드 트리와 같은 방식으로 압축하고자 합니다. 구체적인 방식은 다음과 같습니다.
- 당신이 압축하고자 하는 특정 영역을 S라고 정의합니다.
- 만약 S 내부에 있는 모든 수가 같은 값이라면, S를 해당 수 하나로 압축시킵니다.
- 그렇지 않다면, S를 정확히 4개의 균일한 정사각형 영역(입출력 예를 참고해주시기 바랍니다.)으로 쪼갠 뒤, 각 정사각형 영역에 대해 같은 방식의 압축을 시도합니다.
arr이 매개변수로 주어집니다. 위와 같은 방식으로 arr을 압축했을 때, 배열에 최종적으로 남는 0의 개수와 1의 개수를 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
[제한사항]
- arr의 행의 개수는 1 이상 1024 이하이며, 2의 거듭 제곱수 형태를 하고 있습니다. 즉, arr의 행의 개수는 1, 2, 4, 8, ..., 1024 중 하나입니다.
- arr의 각 행의 길이는 arr의 행의 개수와 같습니다. 즉, arr은 정사각형 배열입니다.
- arr의 각 행에 있는 모든 값은 0 또는 1 입니다.
[입출력]
[입출력 예시]
예제 #1
- 다음 그림은 주어진 arr을 압축하는 과정을 나타낸 것입니다.
예제 #2
- 다음 그림은 주어진 arr을 압축하는 과정을 나타낸 것입니다.
- 최종 압축 결과에 0이 10개, 1이 15개 있으므로, [10,15]를 return 해야 합니다.
[문제풀이]
function solution(arr) { let answer = [0, 0] function recursiveHelper(x, y, len) { // if len is 1, increase the number if (len === 1) return answer[arr[y][x]]++ let tmp = [] for (let i = 0; i < len; i++) tmp = tmp.concat(arr[y+i].slice(x, x+len)) const sum = tmp.reduce((acc, cur) => acc + cur, 0) if (sum === 0) return answer[0]++ else if (sum === len*len) return answer[1]++ len /= 2 recursiveHelper(x, y, len) // 1사분면 recursiveHelper(x+len, y, len) // 2사분면 recursiveHelper(x, y+len, len) // 3사분면 recursiveHelper(x+len, y+len, len) // 4사분면 } recursiveHelper(0, 0, arr.length) return answer; }
Idea:
반응형'Alogorithm' 카테고리의 다른 글
[Algorithm] LeetCode - 1817. Finding the Users Active Minutes(Hash) (0) 2022.01.23 [Algorithm] LeetCode - 1641. Count Sorted Vowel Strings(Dynamic Programming) (0) 2022.01.23 [Algorithm] 프로그래머스 - 큰 수 만들기 (그리디) (0) 2022.01.05 [Algorithm] 프로그래머스 - N으로 표현 (동적계획법) (0) 2021.03.13 [Algorithm] 프로그래머스 - H-Index (정렬 - Sorting) (0) 2020.06.12