양의 정수 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 | result |
[2,7] | [3,11] |
입출력 예 설명
입출력 예 #1
function solution(numbers) { return numbers.map(n => { if(!(n % 2)) { return n + 1; } else { const temp = '0' + n.toString(2); const idx = temp.lastIndexOf('0'); const temp2 = temp.slice(0, idx) + '10' + temp.slice(idx + 2); return parseInt(temp2, 2); } }); }
numbers
배열 안의 숫자들을 순회하면서 조건에 맞는 값으로 대체하기 위해map
을 사용하였다.우선 이진수로 변환했을 때 짝수인 경우 끝자리가 무조건
0
이므로1
이 증가한 값을return
해주면 된다.홀수인 경우 끝에서
0
의 위치를 찾고, 그 전까지는1
이므로01
을10
으로 바꾼 후 10진법으로 바꿔주면 된다.예를 들어 이진법 변환 한 수가
1111
일 경우 그 다음수는10000
이 된다.2비트만 다른 가장 작은수는
10111
인데 주어진 수인1111
의 앞에0
을 붙여01111
과 비교해보면 제일 왼쪽 두개만 바꿔주면 된다는걸 알수있다.
110011
같은 경우도1
증가시키면110100
인데 2비트 다른 가장 작은수는110101
이다.이것도 제일 처음 나오는
0
과 그 오른쪽1
을 바꿔준 값이 답이 되는걸 알 수 있다.
처음에 생각했던 방식은
numbers
의 요소를 1씩 증가시킨 후
원래 숫자와^
로 비트 연산을 해서1
이 2개 이하가 되는 걸 찾으려고 했는데
비교하는 과정이 시간이 걸리기도하고, 1씩 증가시켜서 찾다보니 조건에 맞는 숫자를 찾는데
시간이 또 많이 걸릴수도 있어서 효율성에서 실패했다.
결국 힌트를 참고해서 풀었다.