class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while n: # n > 0:
res += n % 2 # res += n&1
n = n >> 1 # n = n // 2
return res
https://youtu.be/5Km3utixwZs?si=f7G0eyMnnaO_-VMR
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while n: # n > 0:
n &= (n-1) # n = n & (n-1)
res += 1
return res
이 코드는 주어진 정수 n의 이진수 표현에서 1의 개수(해밍 가중치, Hamming Weight) 를 구하는 방법을 구현한 것입니다.
알고리즘의 핵심은 Brian Kernighan 알고리즘으로,
반복할 때마다
n에서 가장 오른쪽에 있는 1 비트를 제거하는 방식으로 동작합니다.
요약
- 목적: 주어진 정수 n의 이진수 표현에서 1의 개수를 계산합니다.
- 핵심 아이디어: n & (n-1) 연산을 통해 매 반복마다 n에서 가장 오른쪽에 있는 1 비트를 제거하고, 제거한 횟수를 세어서 최종적으로 1의 총 개수를 반환합니다.
- 효율성: 이 방법은 n에 있는 1의 개수만큼만 반복하기 때문에, 만약 n이 매우 큰 수이지만 1의 개수가 적다면 효율적으로 동작합니다.
"오른쪽 비트"라는 표현 때문에 혼동이 있을 수 있습니다.
여기서 **"가장 오른쪽에 있는 1 비트"**라는 말은 이진수 표현에서 오른쪽(최하위 자리)에서부터 처음 만나는 1을 의미합니다.
꼭 전체 이진수의 가장 오른쪽(최하위 비트)이 1이라는 뜻이 아니라,
우측에서부터 스캔했을 때 처음 발견되는 1을 의미합니다.
예를 들어, n = 12의 이진수 표현은 1100입니다.
- 이진수 1100을 오른쪽에서부터 살펴보면,
- 가장 오른쪽 비트(2^0 자리는)는 0입니다.
- 그 다음 비트(2^1 자리는)도 0입니다.
- 그 다음 비트(2^2 자리는)는 1입니다.
즉, 오른쪽에서 처음 만나는 1은 2^2(4)를 나타내는 비트입니다. 이 비트를 **가장 오른쪽에 있는 1 비트(최하위의 1)**라고 부르는 것입니다.
Brian Kernighan 알고리즘이 동작하는 원리
- n-1 연산:
- n = 12 (1100)에서 n - 1 = 11 (1011)입니다.
- 12 (1100)에서 가장 오른쪽의 1은 2^2의 자리입니다.
- n - 1 연산은 이 최하위의 1과 그 오른쪽의 모든 비트를 반전시킵니다.
- 1100에서 2^2 자리가 1인 위치 이후(오른쪽)는 모두 0이었으므로, n - 1에서 해당 자리 이후는 모두 1로 바뀝니다.
- 결과적으로 1011이 됩니다.
- n & (n-1) 연산:
- 이제 n & (n-1)를 계산하면,
- 1100 & 1011 = 1000이 됩니다.
- 이 연산은 최하위의 1을 제거하는 효과가 있습니다.
- 즉, 1100에서 2^2에 해당하는 1이 0으로 바뀌고, 나머지 비트는 그대로 유지됩니다.
- 이제 n & (n-1)를 계산하면,
- 반복:
- 이렇게 n에서 1 비트를 하나씩 제거하면서, 제거한 횟수를 센 것이 바로 해밍 가중치(1의 개수)가 됩니다.
요약
- **"가장 오른쪽에 있는 1 비트"**란 이진수의 최하위의 1을 의미하며, 이는 꼭 이진수의 가장 오른쪽(최하위 비트)이 1이라는 뜻이 아닙니다.
- n = 12 (1100)의 경우, 오른쪽에서 첫 번째 1은 2^2의 자리입니다.
- Brian Kernighan 알고리즘은 n & (n-1) 연산을 통해 이 최하위 1 비트를 제거하면서 1의 개수를 센다는 점에서 효율적으로 해밍 가중치를 구할 수 있습니다.
'LeetCode > 주제별 보충' 카테고리의 다른 글
Heap-PrioiryQueue: 295. Find Median from Data Stream ★★★ (0) | 2024.12.22 |
---|---|
BST: 4. Median of Two Sorted Arrays ★★★★★ (2) | 2024.12.21 |
Bits: 190. Reverse Bits (0) | 2024.12.17 |
Graphs(싸이클탐지): 207. Course Schedule ★★★ (0) | 2024.12.16 |
Graphs: 133. Clone Graph (0) | 2024.12.16 |