박종훈 알고리즘 블로그

(Leetcode) 191 - Number of 1 Bits

New Year Gift - Curated List of Top 75 LeetCode Questions to Save Your Time

위 링크에 있는 추천 문제들을 시간이 있을때마다 풀어보려고 한다.


https://leetcode.com/problems/number-of-1-bits/description/

이번 문제는 binary문제이다. bit 연산자를 이용해서 풀면 된다.

쉽게 접근하기

class Solution:
    def hammingWeight(self, n: int) -> int:
        mask = 0xFFFFFFFF
        bits = list("{0:b}".format(n & mask))
        return len(list(filter(lambda b: b == "1", bits)))

제대로 접근하기

class Solution:
    def hammingWeight(self, n: int) -> int:
        res = 0
        while n:
            res += n%2
            n = n>>1
        return res

2진수의 마지막 부분은 1을 나타낸다. 따라서 맨 마지막 숫자가 1일 경우 n%2는 1이 된다. 반대로 0일 경우 n%2는 0이 된다.

>> 연산자는 우측에 있는 숫자만큼 비트를 옮긴다. n>>1 는 1bit 만큼 옮긴다. 옮기면 사라진다. n이 만약 1000 이라면 100 이 되는 것이다.

더 야매로 접근하기

파이썬만 되는 방법

class Solution:
    def hammingWeight(self, n: int) -> int:
        return bin(n).count('1')

참고

지난번 binary문제에서도 이야기 했지만 bit 연산자에 대한 설명은 FAQ: What do the operators <<, >>, &, |, ~, and ^ do?를 참고하면 좋을 것 같다.

자바로 다시 풀기 (24.05.25)

public int hammingWeight(int n) {
    int count = 0;
    while (n != 0) {
        count += n % 2;
        n = n >> 1;
    }
    return count;
}

TC, SC

시간 복잡도는 O(logn)이고, 공간 복잡도는 O(1)이다. logn 인 이유는 bit의 수는 log에 따르기 때문이다.

categories: 스터디-알고리즘

tags: 파이썬 , 알고리즘 , python , algorithm , Leetcode , binary , bit , bit operator