728x90
나의 풀이
def solution(numbers):
answer = []
for n in numbers:
if not n % 2:
answer.append(n + 1)
else:
flag = True
binary = list('0' + bin(n)[2:])
for i in range(len(binary) - 1, -1, -1):
if binary[i] == '0':
binary[i] = '1'
binary[i + 1] = '0'
flag = False
break
answer.append(int('0b' + ''.join(binary), 2))
return answer
XOR를 이용한 풀이
def solution(numbers):
answer = []
for idx, val in enumerate(numbers):
answer.append(((val ^ (val+1)) >> 2) +val +1)
return answer
- val 기준 오른쪽 기준 첫번째 0까지 모두 1이 나옴
- 짝수의 경우 첫번째 자리가 XOR 했을 때 1이므로(첫 0이 처음 자리이므로) XOR한 값의 right shift 2 는 0이 됨
- 홀수의 경우 처음으로 0이 나온 위치에서 오른쪽 2번째부터 1인 숫자를 더하면 됨.
-> 그래야 첫번째가 0이 1로, 그 다음이 0으로 바뀜 (100000...에서 1을 뺀 숫자이므로)
반응형
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스/파이썬] 영어 끝말잇기 (0) | 2022.06.17 |
---|---|
[프로그래머스/파이썬] 삼각 달팽이 (0) | 2022.06.17 |
[프로그래머스/파이썬] [1차] 프렌즈4블록 (0) | 2022.06.16 |
[프로그래머스/파이썬] 피로도 (0) | 2022.06.16 |
[프로그래머스/파이썬] 2 x n 타일링 (0) | 2022.06.16 |