본문 바로가기

Coding Test/Programmers

[프로그래머스/파이썬] 2개 이하로 다른 비트

728x90

 

 

나의 풀이

def solution(numbers):
    answer = []
    for n in numbers:
        if not n % 2:
            answer.append(n + 1)
        else:
            flag = True
            binary = list('0' + bin(n)[2:])
            for i in range(len(binary) - 1, -1, -1):
                if binary[i] == '0':
                    binary[i] = '1'
                    binary[i + 1] = '0'
                    flag = False
                    break
            answer.append(int('0b' + ''.join(binary), 2))
    return answer

 

 

 XOR를 이용한 풀이

def solution(numbers):
    answer = []
    for idx, val in enumerate(numbers):
        answer.append(((val ^ (val+1)) >> 2) +val +1)

    return answer

 - val 기준 오른쪽 기준 첫번째 0까지 모두 1이 나옴

 - 짝수의 경우 첫번째 자리가 XOR 했을 때 1이므로(첫 0이 처음 자리이므로) XOR한 값의 right shift 2 는 0이 됨

 - 홀수의 경우 처음으로 0이 나온 위치에서 오른쪽 2번째부터 1인 숫자를 더하면 됨.

        -> 그래야 첫번째가 0이 1로, 그 다음이 0으로 바뀜 (100000...에서 1을 뺀 숫자이므로)

 

반응형