입력받은 값의 32비트 2진수 표현에서 1의 갯수 구하는 함수 만들기
2023. 1. 2. 01:26ㆍBaekjoon CodingTest
이전에 했던 과제였는데, 조금 고민했던 경험이 있어 오랜만에 다시 작성해봤다.
온라인으로 찾아봐도 비슷한 문제도 안나오길래 아마 다른사람들에게 도움이 될까 싶어 올린다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int sumOneBit(int x);
int main(){
int sum = 0, input;
while(1){
scanf("%d", &input);
if(input == 0){
printf("%d", sum);
break;
} else {
sum += sumOneBit(input);
}
}
}
int sumOneBit(int x){
int count = 0;
int arr[32] = {0};
if(x > 0){
for(int i = 31; i >= 0; i--){
arr[i] = x % 2;
x = x / 2;
if(x == 0){
break;
}
}
for(int i = 0; i <= 31; i++){
if(arr[i] == 1){
count++;
}
}
return count;
} else if(x == 0){
return 0;
} else {
int arr2[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1};
if(x == 1){
return 32;
} else {
x += 1;
for(int i = 31; i >= 0; i--){
arr2[i] = x % 2 + 1;
x = x / 2;
if(x == 0){
break;
}
}
for(int i = 0; i <= 31; i++){
if(arr2[i] == 1){
count++;
}
}
return count;
}
}
return 0;
}
생각해보면 간단한데, 그냥 32개의 원소를 갖는 배열을 만들고 양수일때는 0으로 다 채워둔 상태에서 뒷 자리에서부터 x % 2, x / 2를 반복하며 채워넣으면 되고 음수일 때는 절대값 함수를 사용한 후 +1 매긴 후에(2의 보수를 취하므로, 127 = -128) 동일한 계산을 해준 후 for문으로 호로록 훑어서 1이 몇갠지만 구해주면 되는 문제다.
'Baekjoon CodingTest' 카테고리의 다른 글
백준 2869 자바 (0) | 2020.04.26 |
---|