Concatenation of Consecutive Binary Numbers
> sum * 2^(log k / log 2 + 1) + k
- 위에서 구한 값에 10^9+7을 나눈 나머지를 k까지 덧붙인 이진수로 정한다.
Number.prototype.toString(n)
으로 나타낼 수 있다. 자바스크립트에서 n진수를 10진수로 표현할 때, parseInt(x, n)으로 나타낼 수 있다. 위의 두 메서드로 문제를 풀었을 때, 시간초과가 발생하거나, 숫자가 자바스크립트가 표현할 수 있는 최댓값을 넘어서서, 음수로 표현되었다. 따라서 매 번 계산 때마다 결과를 10^9 + 7의 나머지로 저장을 하여 숫자가 너무 커지지 않도록 하였다. 또한, 메서드를 사용하여 값을 계산하지 않고, 곱하기와 더하기 연산으로 값을 계산하였다.
var concatenatedBinary = function (n) {
const DENOMINATOR = 10 ** 9 + 7;
const result = new Array(n).fill().reduce((sum, _, i) => {
const cur = i + 1;
sum *= 2 ** (Math.floor(Math.log(cur) / Math.log(2)) + 1);
sum += cur;
return sum % DENOMINATOR;
}, 0);
return result;
};
자바스크립트로 큰 수를 표현할 때, 주의해야 함을 알게 되었다. 자바스크립트에 BigInt가 있다고 하는데, 나중에 알아봐야겠다.(나중에한다고 하면 안할 것 같은데ㅠ)
leetcode로 처음 문제를 풀어봤는데, 문제가 상당히 간결하면서도 생각을 할 수 있게 해주어서 좋았다. 테스트케이스도 범위가 굉장히 커서 효율성을 고려하여 코드를 짜는데 큰 도움이 되었다. 시간 복잡도와 공간 복잡도에서 다른 사람들과 비교를 해주니, 더 나은 코드르 찾으려고 노력한 것 같다. 결론은 leetcode 최고!