
브루트포스로 1씩 증가시키며 찾는 방식은 비효율적이다. 규칙을 찾으면 수월하다.
결국 가장 낮은 숫자 자리에 있는 0의 위치를 찾아서 1로 바꾸느냐 마느냐의 문제이다. 2진수로 변경한 뒤 반대로 돌려서 가장 가까운 0의 위치를 찾으면 된다. 그런 다음 위의 조건에 따라 숫자를 바꾸면서 동시에 예외가 발생하지 않도록 각 끝에 0과 1을 붙여준다. 처리가 끝나면 가장 앞의 숫자는 예외처리를 위해 붙인것이므로 제거하고 나머지 숫자들만 다시 10진수로 변경해서 반환한다.
def binary(n):
digit = ['1'] + list(bin(n)[2:][::-1]) + ['0']
idx = digit.index('0')
digit[idx], digit[idx-1] = '1', '0'
return int('0b'+''.join(digit[1:][::-1]), 2)
def solution(numbers):
answer = []
for num in numbers:
answer.append(binary(num))
return answer