2개 이하로 다른 비트
210723
'''
https://programmers.co.kr/learn/courses/30/lessons/77885
2개 이하로 다른 비트
[풀이]
1. 비트 조작
'''
def solution(numbers):
result = []
for number in numbers:
if number % 2 == 0:
result.append(number + 1)
continue
bit = '0' + format(number, 'b')
for idx, val in enumerate(bit[::-1], 1):
if val == "0":
break
idx = len(bit) - idx
bit = bit[:idx] + bit[idx + 1] + bit[idx] + bit[idx + 2:]
result.append(int(bit, 2))
return result
'''
짝수일 경우는 바로 +1 한 수가 되고
홀수일 경우는
1. 제일 오른쪽 자리부터
2. 1이 연속으로 나오다 끝난 자리를 찾고
3. 이 자리와 그 왼쪽에 있는 0을 바꾼 수가 된다.
10진수를 2진수로 변환 : format(num, 'b')
2진수를 10진수로 변환 : int(str, 2)
처음에는 아래 코드처럼 접근했는데, 테스트 10, 11에서 시간초과.
컴퓨터 식 풀이가 아니라 규칙을 찾아야 되는 문제라고 생각이 드는 시점
def solution(numbers):
result = []
for number in numbers:
n = number
number_str = format(number, 'b')
while True:
n += 1
n_str = format(n, 'b')
if len(n_str) > len(number_str):
number_str = '0'*(len(n_str)-len(number_str)) + number_str
if [int(a!=b) for a, b in zip(n_str, number_str)].count(1) <= 2:
result.append(n)
break
return result
다음 코드는 보수를 이용한 코드.
2의 보수와 2를 xor하면 1이 연속되다가 끊기는 부분의 인덱스를 얻을 수 있는 것 같다
def solution(numbers):
answer = []
for idx, val in enumerate(numbers):
answer.append(((val ^ (val+1)) >> 2) +val +1)
return answer
'''
Last updated
Was this helpful?