ํ.. ํ๋ฉด์ ๊ฝค ์ ๋จน์ ๋ฌธ์ ์ด๋ฉฐ ์์ง๊น์ง๋ ์ํ์๊ฐ์ด ๋๋ฌด ์ค๋๊ฑธ๋ ค ๋ง์ ๋ค์ง ์๋ ๋ฌธ์ ์ด๋ค.
์ ์์.
๋ฌธ์  ์กฐ๊ฑด
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 ์
๋๋ค.

์ต์ข ์์ถ ๊ฒฐ๊ณผ์ 0์ด 4๊ฐ, 1์ด 9๊ฐ ์์ผ๋ฏ๋ก, [4,9]๋ฅผ return ํด์ผ ํฉ๋๋ค.

์ต์ข ์์ถ ๊ฒฐ๊ณผ์ 0์ด 10๊ฐ, 1์ด 15๊ฐ ์์ผ๋ฏ๋ก, [10,15]๋ฅผ return ํด์ผ ํฉ๋๋ค.
ํ์ด ์์
function solution(arr) {
    const result = [0,0]
    // ์ฒ์๋ถํฐ ๋ชจ๋  ์์๊ฐ ๊ฐ์ง ์๋ค๋ฉด ๋ถ๋ฆฌ
    if(!isAllSame(arr)) {
        separate(arr).map(a => result[a]++)
    // ์ฒ์๋ถํฐ ๋ชจ๋  ์์๊ฐ ๊ฐ๋ค๋ฉด
    } else {
        // 0์ด๋ผ๋ฉด result๋ฐฐ์ด์ 0 ๋ฒ์งธ๋ฅผ ์ฆ๊ฐ , 1์ด๋ผ๋ฉด ~
        result[arr.flat(Infinity)[0]]++
    }
    
    return result
}
// ๋ฐฐ์ด์ ์ฟผ๋ ๋ถ๋ฆฌํ๋ ๊ณผ์ 
function separate(arr) {
    const arrLen = arr[0].length
    let tLeftArr = []
    let tRightArr = []
    let bLeftArr = []
    let bRightArr = []
    // ๋ถ๋ฆฌ
    for(let i = 0 ; i < arrLen/2 ; i ++) {
        // ์์๋ถํฐ ์ ๋ฐ๊น์ง, ์ ๋ฐ๋ถํฐ ๋๊น์ง
        const topLeft = arr[i].slice(0,arrLen/2)
        const topRight = arr[i].slice(arrLen/2)
        const bLeft = arr[arrLen/2+i].slice(0,arrLen/2)
        const bRight = arr[arrLen/2+i].slice(arrLen/2)
        tLeftArr.push(topLeft)  
        tRightArr.push(topRight)
        bLeftArr.push(bLeft)
        bRightArr.push(bRight)
    }
    // 0 ๋๋ 1๋ก ๋ชจ๋ ๊ฐ๋ค๋ฉด ๋ฐฐ์ด์ ํ๋์ ์์๋ก ์ต์ํ
    if(isAllSame(tLeftArr)) {
        tLeftArr = tLeftArr.flat(Infinity)[0]
        // ๋ ์ชผ๊ฐค ์ ์๋ค๋ฉด ์ฌ๊ทํ๋ฉฐ ๋๊น์ง ์ชผ๊ฐ ๋ค
    } else if(tLeftArr.length !== 1) {
        tLeftArr = separate(tLeftArr)
    }
    if(isAllSame(tRightArr)) {
        tRightArr = tRightArr.flat(Infinity)[0]
    } else if(tRightArr.length !== 1) {
        tRightArr = separate(tRightArr)
    }
    if(isAllSame(bLeftArr)) {
        bLeftArr = bLeftArr.flat(Infinity)[0]
    } else if (bLeftArr.length !== 1) {
        bLeftArr = separate(bLeftArr)
    }
    if(isAllSame(bRightArr)) {
        bRightArr = bRightArr.flat(Infinity)[0]
    } else if(bRightArr.length !== 1) {
        bRightArr = separate(bRightArr)
    }
    
    // ์ชผ๊ฐ์ง ๋ฐฐ์ด 1์ฐจ์ ๋ฐฐ์ด๋ก ์นํ
    return [tLeftArr,tRightArr,bLeftArr,bRightArr].flat(Infinity)
}
// ๋ฐฐ์ด์ ์์๊ฐ ๋ชจ๋ ๊ฐ์์ง ํ๋ณ
function isAllSame(arr) {
    return arr.flat(Infinity).every(el => el === 1) || arr.flat(Infinity).every(el => el === 0)
}
์ฝ๋๊ฐ ์๋นํ ๊ธธ๋ฉฐ ๋ด๊ฐ๋ด๋ ๊ฐ์์ฑ์ด ๋จ์ด์ง๋ค. ๋์ค์ ์๊ฐ์ด ๋๋ฉด ๋ฆฌํํ ๋ง ํด๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์์
์ขํ๋ก ํผ ์ฌ๋๋ค๋ ์๋ค๋๋ฐ.. ๋ ๋ฐฐ์ด๋ก ํ๊ณ ์ถ์๋ค.