1.문제
Given two integers left and right, return the count of numbers in the inclusive range [left, right] having a prime number of set bits in their binary representation.
Recall that the number of set bits an integer has is the number of 1's present when written in binary.
- For example, 21 written in binary is 10101, which has 3 set bits.
left , right 두 정수가 주어질 때 left 와 right 사이의 숫자들을 이진수로 바꾼다음 바꾼 이진수에서 1의 갯수가 소수인 숫자의 갯수를 리턴하면 되는 문제이다.
Example 1
Input: left = 6, right = 10
Output: 4
Explanation:
6 -> 110 (2 set bits, 2 is prime)
7 -> 111 (3 set bits, 3 is prime)
8 -> 1000 (1 set bit, 1 is not prime)
9 -> 1001 (2 set bits, 2 is prime)
10 -> 1010 (2 set bits, 2 is prime)
4 numbers have a prime number of set bits.
Example 2
Input: left = 10, right = 15
Output: 5
Explanation:
10 -> 1010 (2 set bits, 2 is prime)
11 -> 1011 (3 set bits, 3 is prime)
12 -> 1100 (2 set bits, 2 is prime)
13 -> 1101 (3 set bits, 3 is prime)
14 -> 1110 (3 set bits, 3 is prime)
15 -> 1111 (4 set bits, 4 is not prime)
5 numbers have a prime number of set bits.
Constraints:
- 1 <= left <= right <= 10^6
- 0 <= right - left <= 10^4
2.풀이
- left , right 범위를 반복문을 돌면서 이진수로 변환한다.
- 변환한 이진수에서 1의 갯수를 센다
- 이진수의 1의 개수가 소수인지 체크한다.
/**
* @param {number} left
* @param {number} right
* @return {number}
*/
const countPrimeSetBits = function (left, right) {
let count = 0;
// 소수 판별 함수
const isPrime = (num) => {
let count = 1;
for (let i = 1; i < num; i++) {
if (num % i === 0) {
count++;
}
}
return count === 2 ? true : false;
};
for (let i = left; i <= right; i++) {
// left ~ right 구간을 돌면서 이진수로 만든다.
const binary = i.toString(2);
let bitCount = 0;
for (let j = 0; j < binary.length; j++) {
if (binary[j] === "1") {
// 이진수 안의 1의 개수를 센다
bitCount++;
}
}
if (isPrime(bitCount)) count++; // 1의 개수가 소수이면 count ++
}
return count;
};
3.결과
