알고리즘||코딩테스트/백준
[백준 17419번] 비트가 넘쳐흘러 - JAVA
째로스
2023. 6. 30. 02:37
https://www.acmicpc.net/problem/17419
17419번: 비트가 넘쳐흘러
🎶 DJ욱제는 비트에 몸을 맡기는 중이다. 🎶 DJ욱제는 비트에 심취한 나머지, 비트를 비틀어 제껴버리는 문제를 내 버렸다! N자리 이진수 K가 주어진다. K가 0이 아닐 때까지 아래의 연산을 적용
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N=Integer.parseInt(br.readLine());
String binaryStr=br.readLine();
int cnt=0;
for(char a:binaryStr.toCharArray()) {
if(a=='1') {
++cnt;
}
}
System.out.println(cnt);
}
}
문제에서 주어진 식 k=k-(k&((~K)+1))에 대한 이해가 필요하다.
~k+1은 k의 2의 보수로, k=10110(2)=-10 이라면 ~k+1=01001(2)+1=01010(2)=10 이다.
여기서 k와 그의 2의 보수인 ~k+1을 &연산하게 되면 둘의 비트 중 공통된 가장 작은 비트만 1로 남고 나머지는 0이 된다.
k&((~k)+1)=00010(2)
따라서 주어진 식은 k가 갖고 있는 비트 중 값이 1인 최하위 비트를 구하는 것이었다.
그런데 이가 0이 될 때까지 반복하라고 했으므로 k 내부의 비트 중 1의 개수를 구하는 것과 동일한 의미가 된다.
따라서 k가 가진 1의 개수를 카운트하고 출력하면 정답이 된다.