// 어떤 수 N(1≤N≤1,000,000) 이 주어졌을 때, N의 다음 큰 숫자는 다음과 같습니다.
// N의 다음 큰 숫자는 N을 2진수로 바꾸었을 때의 1의 개수와 같은 개수로 이루어진 수입니다. // 1번째 조건을 만족하는 숫자들 중 N보다 큰 수 중에서 가장 작은 숫자를 찾아야 합니다. // 예를 들어, 78을 2진수로 바꾸면 1001110 이며, 78의 다음 큰 숫자는 83으로 2진수는 1010011 입니다. // N이 주어질 때, N의 다음 큰 숫자를 찾는 nextBigNumber 함수를 완성하세요.
// .. 1의 갯수만 같은 거구나 ....
// 우선 2진수로 바꿔야 한다. ->
functionnextBigNumber(n){ const binaryNumbers = [] let count = 0; while(n/2!==0){ if(n%2===1) count+=1 binaryNumbers.unshift(n%2); n=parseInt(n/2); } // let stringBinary = binaryNumbers.join("") const oneIdxList = []; const zeroIdxList = []; let swithced = false; for(let i =0,{length}=binaryNumbers; i<length; i++){ if(binaryNumbers[i]===0) zeroIdxList.push(i) else oneIdxList.push(i) } for(let i =zeroIdxList.length-1; i>=0; i--){ // 1의 마지막 idx값이랑 비교 보통은 0의 마지막이 크면 1의 마지막이랑 바뀌는데 if(oneIdxList[oneIdxList.length-1]>zeroIdxList[i]){ swithced = true; binaryNumbers[zeroIdxList[i]]=1 binaryNumbers[oneIdxList[oneIdxList.length-1]]=0; break; } } // 안 바꾼 경우는 ALL -> 1이거나 111,->1110 111000 -> 1000111 이런 경우 if(!swithced){ if(zeroIdxList.length===0) binaryNumbers.push(0) else { binaryNumbers.map(v=>v===1 ? 0 : 1).unshift(1) } } returnNumber(binaryNumbers.join("")) // 0의 index를 기록 1의 마지막 index랑 비교해서 1의 index가 크면 무시 // 0의 index가 더 크면 1이랑 바꿔 준다. // 그런것이 없다 ex( 1111000)-> 10000111 0이랑 1이랑 바꿔주고 -> 앞에 1을 붙여준다 // 전부 1인 경우 -> 111->0 }
//아래 코드는 테스트를 위한 코드입니다. console.log(nextBigNumber(10)); console.log(nextBigNumber(78));
알고리즘 거의 2시간 함 … = 하루 한 시간만 ++ 심지어 문제도 못 풀었다. …
웹 자판기 Refactoring -> Go GO !!!
객체 관계만… 잘 설정해놓았으면 … 굳이 moneKinds , money들을 따로 만들 필요도 없었네