양의 정수 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 15numbers | 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
으로 답을 도출할 수 있습니다.