2개 이하로 다른 비트
문제
주어진 수보다 크지만 이진수로 변환했을때 비트가 다른 지점이 2개 이하인 수를 구하기.
풀이
def solution(numbers):
result = []
for num in numbers:
if num % 2 == 0:
# 짝수의 경우 무조건 오른쪽 마지막 숫자가 0이다.
result.append(num + 1)
else:
# 홀수의 경우 가장 마지막에 있는 0자리수를 찾아야 한다.
bnum = bin(num)[2:]
n = len(bnum)
idx = bnum.rfind('0')
result.append(num + (1 << (n - idx - 1)) - (1 << (n - idx - 2)))
return result
알게된 점
- 마지막 비트가 0이면 걔만 변환하면 되니까 그런 지점을 찾아서 먼저 처리하는게 효율적이다.
- rfind를 쓰면 꼭 뒤집지 않아도 된다. 뒤집으면 o(1)!
- 비트 움직이는 «, »를 사용하기
Leave a comment