프로그래머스/Lv.2

월간 코드 챌린지 시즌2 > 2개 이하로 다른 비트 - Python, bin, rfind

아찌방 2025. 5. 5. 00:56

 

 

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

코드 & 풀이

 

def solution(numbers):
    answer = []
    
    for num in numbers:
        if num % 2 == 0:
            answer.append(num + 1)
        else:
            num_bit = bin(num)[2:]
            idx = num_bit.rfind('0')
            if idx == -1:
                find_num = '10' + num_bit[1:]
            else:
                find_num = num_bit[:idx] + '10' + num_bit[idx + 2:]
            answer.append(int(find_num, 2))
            
    return answer

 

 

num이 짝수이면 무조건 + 1한 값이 정답

ex)

if num = 2 (10), answer = 3(11)

if num = 4 (100), answer = 5(101)

 

 

num이 홀수이면

  1. 1로만 이루어져 있는 경우 ’10’을 먼저 쓴 후 나머지를 1로 채워줌
    ex)
    if num = 3 (11), answer = 5 (101)
    if num = 7 (111), answer = 11 (1011)
  2. 아닌 경우 (중요)
    가장 오른쪽에 있는 0의 위치를 찾아서 1로, 그 오른쪽 1은 0으로 바꾸는 게 가장 좋음
    ex)
    num = 11 (1011)일때 가장 좋은 경우는 13 (1101)임
    이렇게 만들기 위해
     ‘1’ ( [:0 - idx (1)] ) + ‘10’ + '1'( [idx (1) + 2:] )= ‘1101’

처음에는 숫자를 올려가면서 비트 수를 or 연산 후 1의 개수를 count 했는데

 

이런 방식이 있었음.

 

 

 

다음에 또 봐요

 

728x90