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

2021. 6. 3. 17:10알고리즘

 

※사용언어 : 파이썬 

 

▼ 문제 링크 ▼

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

 

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

 

programmers.co.kr

 

 

 


 

 

문제 접근

◇ 짝수와 홀수의 경우로 나누어서 생각해볼 수 있다.

◇ 짝수인 경우 마지막 bit를 0에서 1로 바꾸면 X보다 크면서 1~2개 비트가 다른 수 중 가장 최솟값이 된다.

4로 예를 든 경우, 노란 밑줄이 그려진 숫자는 변경된 비트를 의미

◇ 홀수인 경우 크게 2가지 경우로 나뉜다.

1. 2진수로 전환시 모든 비트가 1인 경우 (EX. 7, 15)

2. 모든 비트가 1이 아닌 경우 (0이 섞여있는 경우로 9 같은 숫자를 예로 들 수 있다.)

 

◇ 모든 비트가 1인 경우에는 앞에 있는 01을 10으로 바꿔줍니다.

◇ 모든 비트가 1이 아닌 경우에는 가장 마지막에 등장하는 01을 10으로 바꿔줍니다.

 

 


 

 

문제 풀이 (with Python)

def solution(numbers):
    answer = []
    for i in numbers:
        if i%2==0:
            answer.append(i+1)
        else:
            bin_num=str(format(i,'b'))
            point=bin_num.rfind('01')
            if point==-1:
                bin_num='10'+bin_num[1:]
                print(bin_num)
                answer.append(int(bin_num,2))
            else:
                bin_num=bin_num[:point]+'10'+bin_num[point+2:]
                answer.append(int(bin_num,2))
    return answer

◇ 짝수인 경우 입력 받은 number에 +1을 해줍니다

 

◇ 홀수 인 경우 format(i,'b') 를 통해 number를 2진수로 변환 → 2진수를 문자열로 바꾸고 rfind를 통해 문자열 뒤에서부터 01이 있는지 탐색 (없는 경우 -1을 리턴, 있는 경우 01이 시작되는 위치(즉 0의 위치)의 인덱스 값 반환)

 

◇ -1이 반환되는 되면 모든 비트가 1이라는 뜻으로 문자열의 제일 앞에 부분을 자르고 그 앞에 '10'을 붙인다.

 

◇ -1이 아닌 경우 인덱스 위치 전까지 자르고 '10'을 더한 다음 뒤에 있는 문자열을 이어붙임. 이때 point+2가 문자열 범위 밖이면 빈 값을 리턴함

EX. 101011 같은 경우 101 까지 자르고 여기어 10을 더한 뒤 뒤에 있는 1을 붙임