양의 정수 x에 대한 함수 f(x)를 다음과 같이 정의합니다.
예를 들어,
수 비트 다른 비트의 개수
2 000...0010
3 000...0011 1
수 비트 다른 비트의 개수
7 000...0111
8 000...1000 4
9 000...1001 3
10 000...1010 3
11 000...1011 2
정수들이 담긴 배열 numbers가 매개변수로 주어집니다. numbers의 모든 수들에 대하여 각 수의 f 값을 배열에 차례대로 담아 return 하도록 solution 함수를 완성해주세요.
1 ≤ numbers의 길이 ≤ 100,000
0 ≤ numbers의 모든 수 ≤ 1015
numbers result
[2,7] [3,11]
-> 테스트케이스 2개에서 시간 초과가 발생했다.
function solution(numbers) {
let answer = [];
for(let i=0;i<numbers.length;i++){
let bit = numbers[i].toString(2); // 이진수 변환
let num = numbers[i] + 1; // x보다 큰 수
while(true){
let f = 0; // 자릿수 다른 갯수
let bit_num = num.toString(2); // x보다 큰 수를 이진수 변환
// 길이 다를 수 있으므로 맞춰주기
if(bit.length > bit_num.length){
bit_num = '0'.repeat(bit.length - bit_num.length) + bit_num
}else if(bit.length < bit_num.length){
bit = '0'.repeat(bit_num.length - bit.length) + bit
}
for(let j=0;j<bit.length;j++){
if(bit[j] !== bit_num[j]) f++; // 자릿수 다르면 카운트 증가
if(f > 2){
num++;
continue; // 다른 자릿수가 2보다 크면 num증가시켜서 진행
}
}
if(f <= 2){
answer.push(num);
break; // 2보다 같거나 작으면 answer에 담기
}
}
}
return answer;
}
주어진 수 + 1
이 답이다.)function solution(numbers) {
function f(x) {
if (x % 2 === 0) return x + 1;
let bit = "0" + x.toString(2);
let idx = bit.lastIndexOf("0");
return parseInt(`${bit.slice(0, idx)}10${bit.slice(idx + 2)}`, 2);
}
const answer = [];
for (let number of numbers) answer.push(f(number));
return answer;
}