동캄의 코딩도장

프로그래머스 level2 [2개 이하로 다른 비트] 파이썬 본문

코테/프로그래머스

프로그래머스 level2 [2개 이하로 다른 비트] 파이썬

동 캄 2021. 12. 8. 01:07

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

 

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

 

programmers.co.kr

#프로그래머스 2개 이하로 다른 비트
def solution(numbers):
    answer = []
    for number in numbers:
        b=bin(number)[2:]
        k=(number+1)
        while True:
            b_=bin(k)[2:]
            cross=[0]*(len(b_))
            d=len(b_)-len(b)
            for i in range(len(b)):
                if b[i]==b_[d+i]:
                    cross[i]=0
                else:
                    cross[i]=1
            for i in range(d):
                cross.append(1)
            if 1<=cross.count(1)<=2:
                answer.append(k)
                break
            k+=1
    return answer

처음에는 완전탐색으로 number를 기준으로 값을 1씩 더하면서, 차이를 계산하였는데 시간초과가 발생하였다.

 

#프로그래머스 2개 이하로 다른 비트
def solution(numbers):
    from collections import deque
    answer = []
    for number in numbers:
        bit=bin(number)[2:]
        bit=deque(list(map(str,bit)))
        zero_cnt=bit.count('0')
        leng=len(bit)
        if zero_cnt==0:
            bit.appendleft('1')
            bit[1]='0'
        elif zero_cnt==1:
            ind=bit.index('0')
            if ind==(len(bit)-1):
                bit[ind]='1'
            else:
                bit[ind]='1'
                bit[ind+1]='0'
        else:
            for i in range(len(bit)-1,0,-1):
                if bit[i]=='0':
                    break
            if i==(len(bit)-1):
                bit[-1]='1'
            else:
                bit[i]='1'
                bit[i+1]='0'
        answer.append(int(''.join(bit),2))
    return answer

number를 이진수로 바꾼 bit의 0의 개수를 기준으로 조건문을 전개하였다.

0개: 맨 앞에 1을 붙이고, 다음수는 0으로 바꾼다.

1개: 0인 ind를 찾는다. 마지막숫자가 0이면 숫자를 1로 바꾸고, 그렇지 않다면 0을 1로 바꾸고 다음수를 0으로 바꾼다.

2개: 0이나오는 i를 찾는다. 찾으면 반복문 탈출 후, 마지막숫자가 0이면 숫자를 1로 바꾸고, 그렇지 않다면 0을 1로 바꾸고 다음수를 0으로 바꾼다.