티스토리 뷰
문제링크 : https://www.acmicpc.net/problem/17419
17419번: 비트가 넘쳐흘러
🎶 DJ욱제는 비트에 몸을 맡기는 중이다. 🎶 DJ욱제는 비트에 심취한 나머지, 비트를 비틀어 제껴버리는 문제를 내 버렸다! N자리 이진수 K가 주어진다. K가 0이 아닐 때까지 아래의 연산을 적용
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int N;
string K;
cin >> N >> K;
int cnt = 0;
for(int i=0; i<K.size(); i++)
{
if(K[i]=='1') cnt++;
}
cout << cnt;
return 0;
}
- K = K-(K&((~K)+1))
위 연산에 대해서 직접 0이 될때까지 계산을 반복해 보았다.
예제 값을 기준으로 맨 처음 값은 10110이다.
10110 (~K) -> 01001
01001 + 1 -> 01010
10110 & 01010 -> 00010
10110 - 00010 -> 10100
10100을 시작으로 다시 계산하면 10000
10000을 시작으로 다시 계산하면 00000이 된다.
이러면 10110 -> 10100 -> 10000 -> 00000 순으로 변하는 것을 볼 수 있다.
이를 보면 최하위 비트 1의 값이 순서대로 없어지는 것을 볼 수 있다.
따라서 한 번의 계산마다 한 번의 1이 사라지므로 단순히 입력받은 2진수의 1만 카운트하면 된다.
'백준 > 실버' 카테고리의 다른 글
[백준 2512번] 예산 (C++) (0) | 2023.04.06 |
---|---|
[백준 22351번] 수학은 체육과목 입니다 3 (C++) (0) | 2023.04.05 |
[백준 2910번] 빈도 정렬 (C++) (0) | 2023.04.02 |
[백준 14594번] 동방 프로젝트 (Small) (C++) (0) | 2023.04.01 |
[백준 16931번] 겉넓이 구하기 (C++) (0) | 2023.03.29 |