[프로그래머스] Lv2. 2개 이하로 다른 비트

lemythe423·2023년 8월 12일
0
post-thumbnail

🔗

풀이

브루트포스로 1씩 증가시키며 찾는 방식은 비효율적이다. 규칙을 찾으면 수월하다.

숫자를 2진수로 변경했을 때

  • 0으로 끝나는 경우 : 0을 1로 변경
  • 0으로 끝나진 않지만 2진수 사이에 0이 하나라도 있는 경우 : 0 위치의 이전에 있던 1을 0으로 옮기기
  • 2진수에 0이 하나도 없는 경우 : 가장 앞에 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
profile
아무말이나하기

0개의 댓글