320x100
2진법 수에서 1의 수(cnt) 를 세는 알고리즘.
N = 11010(2) 에서 1의 수를 세보자.
일단 N - 1을 구한다. N - 1 = 11001(2)
N, (N - 1)을 AND 연산한다. N & (N - 1) = 11000(2)
연산 결과는 N에서 뒤에서부터 가장 처음나오는 1 비트를 삭제한 결과와 같다.
1비트가 하나 있어서 삭제되었으므로 cnt + 1을 해준다.
이를 N이 0보다 큰경우 반복한다. (N이 0보다 큰 경우 1이 반드시 한 개 있다는 의미이므로)
#include<iostream>
using namespace std;
int main() {
int N;
cin >> N;
int cnt = 0;
while (N > 0) {
N &= (N - 1);
cnt++;
}
cout << cnt << endl;
return 0;
}
시간복잡도는 O(logN)
320x100
'알고리즘 이론' 카테고리의 다른 글
[DP] 배낭 문제(Knapsack Problem) (0) | 2020.11.28 |
---|---|
이진검색트리 (BST: Binary Search Tree) (0) | 2020.10.06 |
문자열 해싱(String Hashing) (0) | 2020.06.20 |
동전 교환(CC: Coin Change) (5) | 2020.02.23 |
다이나믹 프로그래밍(Dynamic Programming) (0) | 2020.02.22 |
댓글