Algorithm | Number of 1 Bits

Updated:
1 minute read

본 글은 leetCode의 Number of 1 Bits 문제 솔루션을 JavaScript 코드로 정리한 글입니다.

Approach #1: Loop and Flip

입력된 정수 n을 binary code로 표기한다면 int형 데이터의 크기는 4 byte이므로 32자리의 수가 될 것입니다.

반복문을 통해 각 자리를 순회하면서 값이 1인지 판단해 1이 나온 횟수를 도출합니다.

var hammingWeight = function(n) {
  let bits = 0;
  let mask = 1;
  for(let i = 0; i < 32; ++i) {
    bits += n & mask;
    n >>= 1;
  }
  return bits;
};

시간복잡도

O(1)

입력값 n이 몇이든 상관없이 자리수 비교 32번을 마치면 답이 구해집니다.

Approach #2: Bit Manipulation Trick

n & (n-1)의 값이 n과 비교해 가장 마지막 자리의 1이 없다는 성질을 이용한 방법입니다.

예를 들어, 1212 - 1 = 11AND 연산한 결과는 다음과 같습니다.

n n - 1 n & (n - 1)
12 11 8
11002 10112 10002

이렇게 n & (n - 1)을 한번 할 때마다 가장 작은 1이 하나씩 없어지는 연산을 반복하여 1의 갯수를 구합니다.

var hammingWeight = function(n) {
  let ret = 0;
  while(n) {
    n &= n - 1;
    ret++;
  }
  return ret;
};

시간복잡도

O(1)

while문의 반복 횟수는 n의 1 bit 개수에 따라 다릅니다. 1 bit가 하나도 없다면 반복 횟수는 0이 되고, 그때가 best case 일 것입니다. 반대로 worst case 에선 모든 bit의 값이 1이라면 반복 횟수는 32가 됩니다.(4 byte 기준) 하지만 best caseworst case 모두 실행 횟수는 n의 값과 상관없는 상수 함수이기 때문에 시간복잡도는 O(1)이 됩니다.

Back to top ↑

Leave a comment