입력받은 값의 32비트 2진수 표현에서 1의 갯수 구하는 함수 만들기

2023. 1. 2. 01:26Baekjoon 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