문제 설명
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
1. x의 모든 0을 제거합니다.
2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
s의 길이는 1 이상 150,000 이하입니다.
s에는 '1'이 최소 하나 이상 포함되어 있습니다.
포인트
- strdup()으로 문자열 복사 후 매 반복마다 free()로 메모리 관리
- 직접 10진수 → 2진수 변환 및 문자열 뒤집기 수행
- while(strcmp(str, "1") != 0)을 조건으로 사용
int* solution(const char* s) {
int* answer = (int*)malloc(sizeof(int) * 2);
answer[0] = 0; // 변환 횟수
answer[1] = 0; // 제거된 0의 개수
char* str = strdup(s);
char buffer[200];
while (strcmp(str, "1") != 0) {
int ones = 0;
for (int i = 0; str[i]; i++) {
if (str[i] == '1') ones++;
else answer[1]++;
}
// 정수 → 2진 문자열로 변환
int len = 0, temp = ones;
while (temp > 0) {
buffer[len++] = (temp % 2) + '0';
temp /= 2;
}
buffer[len] = '\0';
// 뒤집기
for (int i = 0; i < len / 2; i++) {
char t = buffer[i];
buffer[i] = buffer[len - 1 - i];
buffer[len - 1 - i] = t;
}
free(str);
str = strdup(buffer);
answer[0]++;
}
free(str);
return answer;
}
'프로그래머스' 카테고리의 다른 글
[프로그래머스] [C] Lv.1 달리기 경주 (0) | 2025.04.15 |
---|---|
[프로그래머스] [C] Lv.2 귤 고르기 (0) | 2025.04.14 |
[프로그래머스] [C] Lv.1 대충 만든 자판 (0) | 2025.04.11 |
[프로그래머스] [C] Lv.1 공원 산책 (0) | 2025.04.10 |
[프로그래머스] [C] Lv.1 기사단원의 무기 (0) | 2024.04.01 |