본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 2 : 이진 변환 반복하기 C언어

by starfish22 2022. 4. 24.
728x90

▶문제 : 코딩테스트 연습 - 이진 변환 반복하기 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 이진 변환 반복하기

 

programmers.co.kr

 

▶코드 작성

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

char str[150000];//복사, 수정용 문자열 선언

// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
int *solution(const char *s)
{
    int *answer = (int *)malloc(sizeof(int) * 2);

    answer[0] = answer[1] = 0;//0으로 초기화
    strcpy(str, s);//수정하기 위해 복사
    int num, leng = strlen(str);

    while (1)
    {
        answer[0]++;//이진 변환 횟수
        num = 0;
        for (int i = 0; i < leng; i++) {//문자열 길이만큼 반복
            if (str[i] == '0') answer[1]++;//0일 때 개수
            else if (str[i] == '1') num++;//1일 때 개수
        }
        if (num == 1) break;//1의 개수가 하나일 때 종료

        leng = 0;
        while (num != 0) {//1의 개수를 저장한 num을 2진수로 변환하여 str에 저장
            str[leng++] = num % 2 + '0';
            num /= 2;
        }
    }

    return answer;
}

 

▶해석

문제를 풀 때 1의 개수를 2진수로 변환해서 풀어야 하므로 수정할 수 있는 문자열 str를 선언하였다.

answer[0]가 이진 변환 횟수, answer[1]가 0을 제거하는 횟수이므로 0으로 초기화 시킨다.

 

while문을 시작으로 for문을 이용해 leng까지 반복하여 0과 1로 나누었다.

0이면 answer[1]++ , 1이면 num++ 하여 num은 1의 개수를 나타낸다.

num이 1일 때 개수가 하나밖에 없으므로 종료한다.

 

1의 개수를 2진수로 변환해야 하므로 while문으로 num을 2진수로 변환해주었다.

변환한 2진수를 str문자열에 저장하고, leng변수로 문자열의 길이도 저장하였다.

 

다시 str문자열을 이용해 0과 1로 나누면서 반복할 수 있다.

728x90

댓글