ํ.. ํ๋ฉด์ ๊ฝค ์ ๋จน์ ๋ฌธ์ ์ด๋ฉฐ ์์ง๊น์ง๋ ์ํ์๊ฐ์ด ๋๋ฌด ์ค๋๊ฑธ๋ ค ๋ง์ ๋ค์ง ์๋ ๋ฌธ์ ์ด๋ค.
์ ์์.
๋ฌธ์ ์กฐ๊ฑด
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)
}
์ฝ๋๊ฐ ์๋นํ ๊ธธ๋ฉฐ ๋ด๊ฐ๋ด๋ ๊ฐ์์ฑ์ด ๋จ์ด์ง๋ค. ๋์ค์ ์๊ฐ์ด ๋๋ฉด ๋ฆฌํํ ๋ง ํด๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์์
์ขํ๋ก ํผ ์ฌ๋๋ค๋ ์๋ค๋๋ฐ.. ๋ ๋ฐฐ์ด๋ก ํ๊ณ ์ถ์๋ค.