Skip to content

Instantly share code, notes, and snippets.

@rpf5573 rpf5573/test2.js
Created Jan 15, 2019

Embed
What would you like to do?
function transform(input) {
if ( input < 2 ) {
return [input]; // 0이나 1은 그냥 돌려 보낸다.
}
var result = [];
var rest = input; // 처음엔 나머지값을 그냥 들어온값으로 취급해주자
var numberOfDigits = 1; // 2진수의 자리수, 예를들어 1011 = 4자리
var mostBigNumber = 1; // 맨 앞부터 시작해서 들어갈 2의 x승. 처음에는 가장큰 2의 x승이 들어갈 예정.
// input을 2진수로 변환했을때의 자리수와 맨 처음에 들어가는 1이 2의 몇승인지를 구하는 과정.
// 예를들어 22가 들어오면 5자리가 되고 맨 처음 들어가는 1은 2의 4승이 된다.
// 핵심은 2로 계속 나눠주는것 !
while( rest != 1 && rest != 0 ) {
if ( rest%2 == 0 ) { // 홀수인지 짝수인지 체크. 나머지가 0이면 짝수 1이면 홀수
rest = rest/2; // 바로 나누고,
} else {
rest = (rest-1)/2; // 1을 빼서 나누고
}
mostBigNumber = mostBigNumber * 2; // 가장큰 2의 x승을 구한다
numberOfDigits++;
}
result = new Array(numberOfDigits);
result[0] = 1; // 첫번째 칸은 1로 채워준다.
// 이제 2번째 ~ 마지막 칸에 0이 들어갈지 1이 들어갈지 판단해 주자.
// 핵심은 rest가 2의 x승보다 큰지 작은지를 판별하는것 !
rest = input - mostBigNumber; // 22가 들어온다면 22 - 16(위에서 구한 값)해서 6이 rest안에 들어감
for ( var i = 1; i < numberOfDigits; i++ ) {
let two_x = Math.pow(2, (numberOfDigits - i - 1)); // 해당 자리수에 일치하는 2의 x승
// rest가 2의 x승보다 작으면, 말 그대로 rest안에 해당 2의 x승이 들어있을리 만무하기 때문에 0을 넣어준다
if ( rest < two_x ) {
result[i] = 0;
}
// 만약에 더 크거나 같으면, 무조건 들어있을 것이다.
// 예를들어 17이 남았다면 16이 꼭 들어있어야 하고, 10이 남았다면 8이 들어있어야 한다. 그렇지 않으면
// 그 뒤의 값들(4,2..) 로는 나머지값을 체울 수 없기 때문이다.
else {
result[i] = 1;
rest = rest - two_x;
}
}
return result;
}
transform(8); // [1, 0, 0, 0];
transform(20); // [1, 0, 1, 0, 0];
transform(41); // [1, 0, 1, 0, 0, 1];
transform(65); // [1, 0, 0, 0, 0, 0, 1];
// done in 0.07 seconds
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.