https://school.programmers.co.kr/learn/courses/30/lessons/77885
문제에서 원하는 것은 주어진 숫자x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수 찾는 것이다.
이문제는 짝수와 홀수로 나누어 이 문제를 풀 수 있다.
- 짝수일때
짝수를 이진법으로 변환했을때 마지막 숫자는 무조건 0이 될것이다.
2 --> 10
4 --> 100
6 --> 110
마지막 숫자를 0을 1로 바꿔주면 x보다 크지만 다른 비트 갯수가 1개인 숫자를 찾을 수 있다.
이 숫자는 주어진 짝수에서 +1가 된다.- 홀수일때
홀수를 이진법으로 변환했을때 가장 오른쪽에 있는 '0'을 찾는 것이 중요하다.
가장 오른쪽에 위치한 0의 인덱스가 n이라고 가정한다.
그렇다면 n인덱스에 위치한 0을 1로 바꿔주고, n+1에 위치한 0으로 바꿔준다.
예를 들자면 아래와 같습니다.
3 --> 011 --> 101(5)
5 --> 101 --> 110(6)
7 --> 0111 --> 1011(11)
9 --> 1001 --> 1010(10)
def solution(numbers):
answer = []
for n in numbers:
if n % 2 == 0: # 짝수일 경우
answer.append(n + 1)
else: # 홀수 인 경우
temp = '0' + bin(n)[2:]
right_idx = temp.rfind('0')
temp_list = list(temp)
temp_list[right_idx] = '1'
temp_list[right_idx+1] = '0'
temp_str = "".join(temp_list)
answer.append(int(temp_str, 2))
return answer