프로그래머스/lv.2

2개 이하로 다른 비트

bingual 2024. 2. 26. 18:08
반응형

 

https://school.programmers.co.kr/learn/courses/30/lessons/77885

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제풀이

  • num ^ (num + 1)에서 x ^ yXOR 연산자로 이진수로 변환한 x와 y에 대해 둘의 비트 지점이 같을 경우 0을 다를 경우 1를 반환하고 그 결과를 십진수로 변환하여 반환한다. 7 ^ 8이라고 한다면 0111 ^ 1000 = 1111이 되며 이를 십진수로 변환하면 15가 된다. 
  • (num ^ (num + 1)) >> 2에서 x >> y시프트 연산자로 각 비트를 오른쪽으로 이동 시킨다. 이동된 비트의 자리는 0으로 대체된다. 따라서 1111 >> 2 = 0011이 되며 이를 십진수로 변환하면 3이 된다. 즉 x >> y는 x // (2**y)와 같다.
  • 마지막으로 위에 결과에 대해 num + 1을 해주게 된다면 7이 입력으로 주어졌을 때 15 // 4 + 7 + 1 = 11을 2가 입력으로 주어졌을 때 1 // 4 + 2 + 1 = 3이 된다.
def solution(numbers):
    return [((num ^ (num + 1)) >> 2) + num + 1 for num in numbers]