양의 정수 x
에 대한 함수 f(x)
를 다음과 같이 정의합니다.
x
보다 크고 x
와 비트가 1~2개 다른 수들 중에서 제일 작은 수예를 들어,
f(2) = 3
입니다. 다음 표와 같이 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 3이기 때문입니다.수 | 비트 | 다른 비트의 개수 |
---|---|---|
2 | 000...0010 |
|
3 | 000...0011 |
1 |
f(7) = 11
입니다. 다음 표와 같이 7보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 11이기 때문입니다.수 | 비트 | 다른 비트의 개수 |
---|---|---|
7 | 000...0111 |
|
8 | 000...1000 |
4 |
9 | 000...1001 |
3 |
10 | 000...1010 |
3 |
11 | 000...1011 |
2 |
정수들이 담긴 배열 numbers
가 매개변수로 주어집니다. numbers
의 모든 수들에 대하여 각 수의 f
값을 배열에 차례대로 담아 return 하도록 solution 함수를 완성해주세요.
numbers
의 길이 ≤ 100,000numbers
의 모든 수 ≤ 1015numbers | result |
---|---|
[2,7] |
[3,11] |
입출력 예 #1
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
- 짝수 홀수 구분
1) 짝수라면 +1 해준 값을 answer에 추가
-> 12와 같은 짝수라면 아래와 같은 과정이기 때문
12 -> 1100 -> 1101 (틀린 거 1개) -> OK
2)홀수라면 아래 과정 실행- 첫번째 자리부터 0인 부분을 찾음. 그 찾은 부분 자리 인덱스 만큼 2의 거듭제곱을 더해주고 그 (인덱스-1) 만큼의 거듭제곱을 다시 빼줌.
-> 11의 예시로 들어보자
11 -> 1011 -> 0을 찾자. 3번째 자릿수 -> 1011 + 100 - 10 -> 1101 (OK)- 만약 0이 없다면? 입력값 2진수의 길이의 2거듭제곱을 더해주고 그 값에 1을 뺀 거듭제곱을 빼준다.
-> 15를 예를 들어보자
-> 15 - > 1111 -> 0없음 길이는? 4 -> 2^4 = 16 -> 10000 -> 1111 + 10000 - 1000 => 10111 (OK)
function solution(numbers) {
var answer = [];
numbers.forEach((element)=>{
//짝수라면
if(element%2===0){
answer.push(element+1)
}
//홀수라면
else{
var bianryNum = element.toString(2);
for(var i = bianryNum.length-1;i>=0;i--){
if(bianryNum[i]==='0'){
answer.push(element+2**(bianryNum.length-i-1)-2**(bianryNum.length-i-2));
break;
}
if(i===0){
answer.push(element+2**(bianryNum.length-i)-2**(bianryNum.length-i-1));
}
}
}
})
return answer;
}