def solution(numbers):
answer = []
for num in numbers:
# 만약 숫자가 짝수라면 다음 수는 바로 +1
if num % 2 == 0:
answer.append(num + 1)
else:
# XOR 연산을 이용해 최소 1비트 차이 나는 수 찾기
smallest_diff = (num ^ (num + 1)) >> 2
answer.append(num + smallest_diff + 1)
return answer
풀이
처음에는 2진법으로 모든 숫자를 바꿔서 해결하려고 했는데 당 당 히 시간초과 후 방법을 바꾸기로 했다..ㅎㅎ
역시 이런건 규칙이 있기 마련인데 규칙 찾기가 매우매우 힘들었다. 짝수일 경우, 바로 다음 숫자가 답이다. 근데 문제는 홀수일 때라는 것이지.. 방법은 XOR 연산이라는데 사실 나도 이게 여기서 나올줄은 몰랐다.
num ^ (num + 1) num과 num + 1 간의 비트 차이를 확인하는데, 예를 들어 num = 5일 경우 이렇게 돌아간다. num : 101 num + 1 : 110 XOR(diff): 011 -> 두 숫자 간 차이가 나는 위치가 비트로 나타난다
>>2를 한 이유는 가장 작은 차이를 가진 비트를 무시하고 그 다음 차이를 찾아야해서다. 그리고 원래 수 num에 차이 smallest_diff, 그리고 그 다음 수를 의미하는 1을 더해 답을 구한다!!
이 방법은 나도 완벽하게 이해하지는 못했고, MS에서 ^는 파이썬의 **와 동일한 개념으로 쓰여서 더 헷갈리는 것 같다.. 그치만 파이썬에서 ^는 XOR 연산이라는거.. 별 다섯개..⭐⭐⭐⭐⭐