07.29에 푼 문제입니다🌷
쿼드압축 후 개수 세기
이 문제는 DFS로 풀었다.
배열이 주어지면 4분할을 한다.
Q1 Q2
Q3 Q4
쪼개진 4개의 배열에 0으로만 된 것과 1로 된 것은
0, 1 개수를 더해주고 끝난다.
0과 1이 섞인 배열은 다시 dfs로 4분할을 한다.
이 과정을 반복하고 배열에 1개만 남았을 때
0,1 개수를 세고 끝난다.
function solution(arr) {
if(zeroORone(arr)===1) return [0,1]
else if(zeroORone(arr)===0) return[1,0]
checkQ(arr)
return answer;
}
var answer = [0,0];
// 배열 쪼개기
function checkQ(arr){
let half = arr.length/2
if(arr.length<=1) {
let num =arr[0][0]
if(num===0) answer[0]++
if(num===1) answer[1]++
return answer
}
const Q1 =[], Q2=[], Q3=[], Q4=[]
for(let i=0;i<arr.length;i++){
if(i<half){
//1
let tmp1 = []
for(let j=0;j<half;j++) {
tmp1.push(arr[i][j])
}
Q1.push(tmp1)
//2
let tmp2 = []
for(let j=half;j<arr.length;j++) {
tmp2.push(arr[i][j])
}
Q2.push(tmp2)
}
else{
//3
let tmp3 = []
for(let j=0;j<half;j++) {
tmp3.push(arr[i][j])
}
Q3.push(tmp3)
//2
let tmp4 = []
for(let j=half;j<arr.length;j++) {
tmp4.push(arr[i][j])
}
Q4.push(tmp4)
}
}
if(zeroORone(Q1)===0) answer[0]++
else if(zeroORone(Q1)===1) answer[1]++
else checkQ(Q1)
if(zeroORone(Q2)===0) answer[0]++
else if(zeroORone(Q2)===1) answer[1]++
else checkQ(Q2)
if(zeroORone(Q3)===0) answer[0]++
else if(zeroORone(Q3)===1) answer[1]++
else checkQ(Q3)
if(zeroORone(Q4)===0) answer[0]++
else if(zeroORone(Q4)===1) answer[1]++
else checkQ(Q4)
}
// 0, 1 개수 체크
function zeroORone(arr){
arr = arr.flat()
if(arr.filter(q=>q===0).length===arr.length){
return 0
}
else if(arr.filter(q=>q===1).length===arr.length){
return 1
}
return 2
}