크게 두 단계로 나뉜다. 주어진 n을 이진수로 변환하기. n+1의 이진수를 확인하기. 후자를 구할 때 n에서와 동일한 방법을 선택했다가 시간 초과가 떴는데, 이를 방지하기 위해 n의 이진수 n_bin을 통해 1(=2의 0승)의 자리수를 확인해 n+1 이진수를 반환하는 함수를 만들었다.
def get_bin(n):
power_n = 1
while 2**power_n < n:
power_n += 1
n_bin = ''
for i in range(power_n-1, -1, -1):
if n >= 2**i:
n -= 2**i
n_bin += '1'
else:
n_bin += '0'
return n_bin
def get_next_bin(n_bin):
if n_bin[-1] == '0':
n_bin = n_bin[:-1] + '1'
else:
n_bin = '0' + n_bin
zero_idx = n_bin.rfind('0')
n_bin = n_bin[:zero_idx] + '1' + '0' * len(n_bin[zero_idx+1:])
if n_bin[0] == '0': n_bin = n_bin[1:]
return n_bin
def solution(n):
n_bin = get_bin(n)
ones_n = len([x for x in n_bin if x == '1'])
next_n = n + 1
while(True):
next_bin = get_next_bin(n_bin)
ones_next = len([x for x in next_bin if x == '1'])
if ones_next == ones_n:
return next_n
n_bin = next_bin
next_n += 1