양의 정수 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의 모든 수 ≤ 10 15| numbers | result |
|---|---|
| [2,7] | [3,11] |
def solution(numbers):
answer = []
for num in numbers:
# 짝수일때
bin_num = list('0'+bin(num)[2:])
idx = ''.join(bin_num).rfind('0')
bin_num[idx] = '1'
#홀수일때
if num % 2 != 0:
bin_num[idx+1] = '0'
answer.append(int(''.join(bin_num),2))
return answer
짝수와 홀수일때 구분지어서 생각해야 합니다.
만약 짝수인 2를 예시로 들었을때, (3자리수에 맞춰서)
2를 이진수로 변환 시 010이고 이때 0이 등장한 마지막 위치를 rfind() 메소드를 통해 찾게 되면 0의 위치값은 2입니다.
따라서 이 위치값에 해당하는 부분을 1로 변환시, 011이 되고 문제여서 요구하는 answer에 상응합니다.
반면 홀수일 경우에는 7를 예시로 들었을때,
5를 이진수로 변환하면 1101이고 그리고 0의 위치를 찾아 1로 값을 assign 했을때까지 보면 1111이고 이때 1개~2개에서 다른 수 중 가장 작은 수를 return 해야 하므로 찾았던 0의 위치 idx에서 한칸 오른쪽 이동한 idx에 0을 할당합니다.
그러면 1011으로 답을 도출할 수 있습니다.