[プログラマLv 2]2個以下のビット数(python)


質問する


https://programmers.co.kr/learn/courses/30/lessons/77885

マイコード(答えを参照)

"""
1. 아이디어

2. 시간복잡도

"""

def convert(num):
    
    # 짝수인 경우 num보다 크며 2개 이하인 비트는 +1한 값이다.
    if num % 2 == 0: 
        return num+1
	
    
    else: # 홀수인 경우는 일정 규칙에 의거해서 num을 반환해준다.
        bin_num = '0' + bin(num)[2:]
        idx = bin_num.rfind('0')
        bin_num = list(bin_num)
        bin_num[idx] = '1'
        bin_num[idx+1] = '0'
        return int(''.join(bin_num), 2)

def solution(numbers):

    answer = [ convert(int(num)) for num in numbers]
	# 이것도 리스트 내에서 int() 안해주면 TC 7,8,9에서 에러남 이유는 모름..
    
    return answer

print(solution([2, 7]))
    

説明:


1)偶数の場合
4の場合、バイナリ数は100です.4より大きく、2より少ない別の数が見つかった場合は101です.
つまり、一番後ろの0を1に変えればいいのです.
2)奇数に対して
7の場合はバイナリ0111を使用します(置換の便宜上、前に0を加えます)
まず、一番後ろのゼロインデックス(idx)を検索し、偶数のように1に置き換えます.1111になります
bin_num[idx] = '1'
次にidx+1のインデックス値を0に変更します.では1011になります
bin_num[idx+1] = '0'
このようなルールを見つけるのは容易なことではありませんが、どうやって見つけるか分かりません.
1時間挿入して1時間理解しました.

参考資料


https://velog.io/@kerri/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4Lv2-2%EA%B0%9C-%EC%9D%B4%ED%95%98%EB%A1%9C-%EB%8B%A4%EB%A5%B8-%EB%B9%84%ED%8A%B8