ํ›„.. ํ’€๋ฉด์„œ ๊ฝค ์• ๋จน์€ ๋ฌธ์ œ์ด๋ฉฐ ์•„์ง๊นŒ์ง€๋„ ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜๊ฑธ๋ ค ๋ง˜์— ๋“ค์ง€ ์•Š๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ž ์‹œ์ž‘.

๋ฌธ์ œ ์กฐ๊ฑด

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)
}

์ฝ”๋“œ๊ฐ€ ์ƒ๋‹นํžˆ ๊ธธ๋ฉฐ ๋‚ด๊ฐ€๋ด๋„ ๊ฐ€์‹œ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. ๋‚˜์ค‘์— ์‹œ๊ฐ„์ด ๋˜๋ฉด ๋ฆฌํŽ™ํ† ๋ง ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Œ

์ขŒํ‘œ๋กœ ํ‘ผ ์‚ฌ๋žŒ๋“ค๋„ ์žˆ๋‹ค๋Š”๋ฐ.. ๋‚œ ๋ฐฐ์—ด๋กœ ํ’€๊ณ ์‹ถ์—ˆ๋‹ค.

profile
๋‚ด ์ง€์‹์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋‹ดํ•จ

0๊ฐœ์˜ ๋Œ“๊ธ€