이해
- 양의 정수 x가 주어질 때, x보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수를 return하라.
- 예를 들어, x = 2일 때 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수는 3이 된다.
- 2: 000…0010
- 3: 000…0011
계획
- 입력받은 숫자를 2진수로 변환한 후 최하위 비트부터 올라가서 처음으로 0이 나오는 위치를 찾은 후에 1로 바뀌주고 바로 오른쪽 위치에 비트가 존재한다면 0으로 바꿔주어 비트가 다른 지점이 2개 이하인 제일 작은 수를 구해준다.
- 모든 비트가 1인 경우에는 처음으로 0이 나오는 위치를 찾을 수가 없기 때문에 위치를 탐색하기 전에 최상위 비트에 0을 넣어준다.
- for문을 사용하여 문자열로 표현된 이진수의 최하위 비트부터 탐색하면서 처음으로 0이 나오는 위치를 찾아준다.
실행
def dec_to_bin(num):
temp = ""
while num > 0:
temp = str(num % 2) + temp
num //= 2
return temp
def bin_to_dec(s):
dec_num = 0
rev_s = s[::-1]
for i in range(len(s)):
dec_num += int(rev_s[i])*(2**i)
return dec_num
def solution(numbers):
result = []
for num in numbers:
bin_num = list('0' + dec_to_bin(num))
for i in range(len(bin_num) - 1, -1, -1):
if bin_num[i] == '0':
bin_num[i] = '1'
if i != len(bin_num) - 1:
bin_num[i+1] = '0'
break
result.append(bin_to_dec("".join(bin_num)))
return result
개선
- 십진수를 이진수로 변환할 때 비트 값을 문자가 아닌 숫자로 다뤄주면 str, int함수를 사용하지 않고 간단히 구현할 수 있다.
def dec_to_bin(num):
temp = []
while num > 0:
temp.append(num % 2)
num //= 2
return temp[::-1]
def bin_to_dec(bin_num):
dec_num = 0
for i in range(len(bin_num)):
dec_num += bin_num[len(bin_num)-i-1]*(2**i)
return dec_num
def solution(numbers):
result = []
for num in numbers:
bin_num = [0] + dec_to_bin(num)
for i in range(len(bin_num) - 1, -1, -1):
if bin_num[i] == 0:
bin_num[i] = 1
if i != len(bin_num) - 1:
bin_num[i+1] = 0
break
result.append(bin_to_dec(bin_num))
return result
- dec_to_bin, bin_to_dec 함수를 정의하지 않고, bin, int 내장함수를 사용하여 간단하게 구현이 가능하다.
def solution(numbers): result = [] for num in numbers: bin_num = list('0' + bin(num)[2:]) for i in range(len(bin_num) - 1, -1, -1): if bin_num[i] == '0': bin_num[i] = '1' if i != len(bin_num) - 1: bin_num[i+1] = '0' break result.append(int("".join(bin_num), 2)) return result
회고
- bin, int 내장함수를 사용하면 더 간단하게 구현이 가능하다는 것을 알고 있었는데 내장함수의 인자 값과 반환 값 형태가 잘 기억이 나지 않아서 직접 함수를 정의해서 구현하였다. bin, oct, hex 내장함수를 꼭 기억해놔야겠다.