728x90
▶문제 : 코딩테스트 연습 - 이진 변환 반복하기 | 프로그래머스 (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
'프로그래머스 > C' 카테고리의 다른 글
프로그래머스 Level 2 : 피로도 C언어 (0) | 2022.07.02 |
---|---|
프로그래머스 Level 2 : 괄호 회전하기 C언어 (0) | 2022.06.21 |
프로그래머스 Level 2 : 행렬 테두리 회전하기 C언어 (0) | 2022.04.23 |
프로그래머스 Level 2 : 최솟값 만들기 C언어 (0) | 2022.04.21 |
프로그래머스 Level 2 : N개의 최소공배수 C언어(시간단축) (0) | 2022.03.28 |
댓글