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

dobyming·2023년 2월 14일
0

문제 설명

양의 정수 x에 대한 함수 f(x)를 다음과 같이 정의합니다.

  • x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수

예를 들어,

  • f(2) = 3 입니다. 다음 표와 같이 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 3이기 때문입니다.
비트다른 비트의 개수
2000...0010
3000...00111
  • f(7) = 11 입니다. 다음 표와 같이 7보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 11이기 때문입니다.
비트다른 비트의 개수
7000...0111
8000...10004
9000...10013
10000...10103
11000...10112

정수들이 담긴 배열 numbers가 매개변수로 주어집니다. numbers의 모든 수들에 대하여 각 수의 f 값을 배열에 차례대로 담아 return 하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ numbers의 길이 ≤ 100,000
  • 0 ≤ numbers의 모든 수 ≤ 10 15

입출력 예

numbersresult
[2,7][3,11]

내 코드

def solution(numbers):
    answer = []
    for num in numbers:
    	# 짝수일때
        bin_num = list('0'+bin(num)[2:])
        idx = ''.join(bin_num).rfind('0')
        bin_num[idx] = '1'
        
        #홀수일때 
        if num % 2 != 0:
            bin_num[idx+1] = '0'
        
        answer.append(int(''.join(bin_num),2))
    return answer

아이디어

짝수와 홀수일때 구분지어서 생각해야 합니다.

짝수

만약 짝수인 2를 예시로 들었을때, (3자리수에 맞춰서)
2를 이진수로 변환 시 010이고 이때 0이 등장한 마지막 위치를 rfind() 메소드를 통해 찾게 되면 0의 위치값은 2입니다.
따라서 이 위치값에 해당하는 부분을 1로 변환시, 011이 되고 문제여서 요구하는 answer에 상응합니다.

홀수

반면 홀수일 경우에는 7를 예시로 들었을때,
5를 이진수로 변환하면 1101이고 그리고 0의 위치를 찾아 1로 값을 assign 했을때까지 보면 1111이고 이때 1개~2개에서 다른 수 중 가장 작은 수를 return 해야 하므로 찾았던 0의 위치 idx에서 한칸 오른쪽 이동한 idx에 0을 할당합니다.
그러면 1011으로 답을 도출할 수 있습니다.

0개의 댓글