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