프로그래머스 : 2개 이하로 다른 비트

2021. 10. 21. 04:23문제풀기/프로그래머스

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

 

코딩테스트 연습 - 2개 이하로 다른 비트

 

programmers.co.kr

 

2진수로 변환했을 때, 다 1로 이루어져 있는 경우는 10111...의 꼴이 2개 이하로 비트가 다르면서 가장 작은 수이므로 다 1로 이루어져 있는 경우와 아닌 경우를 구분해서 시행한다.

1로 이루어져 있는 경우는, 오른쪽에서 왼쪽으로 이동해가면서 0을 만나면 1로 만나고, 해당 위치의 바로 오른쪽이 1이라 0으로 바꿀 수 있으면 바꿔준다.

* 0일 때는 예외처리를 꼭 해줘야한다!

 

def get_binary(n):
    answer = []
    now = 2
    
    while n>0:
        answer.append(n%now)
        n = n//now
        
    answer.reverse()
    return answer

def get_deci(binary_arr):
    now = 1
    answer = 0

    for i in range(len(binary_arr)-1,-1,-1):
        answer += now * binary_arr[i]
        now *= 2

    return answer

def solution(numbers):
    answer = []
    
    for i in numbers:
        if i == 0:
            answer.append(1)
            continue
        binary_arr = get_binary(i)

        if len(binary_arr) == binary_arr.count(1):
            binary_arr = [1,0] + binary_arr[1:]
        else:
            for i in range(len(binary_arr)-1,-1,-1):
                if binary_arr[i] == 0:
                    binary_arr[i] = 1
                    if i+1<len(binary_arr) and binary_arr[i+1]==1:
                        binary_arr[i+1] = 0
                    break
        answer.append(get_deci(binary_arr))
        
    return answer