<프로그래머스 C++> 이진 변환 반복하기 풀이
2026. 6. 11. 10:36ㆍProgrammers
문제
0과 1로 이루어진 문자열 s에 이진 변환을 반복 적용하는 문제이다.
이진 변환 규칙
1. s의 모든 0을 제거한다.
2. 제거 후 길이를 2진수의 문자열로 변환.
s가 "1"이 될 때까지 반복하며, 변환 횟수와 제거된 0의 총 개수를 return한다.

풀이 아이디어
s가 "1"이 될 때까지 반복하므로 while(s != "1") 구조를 선택했다.
매 반복마다 세 가지를 처리해야한다.
1. '1'의 개수를 세서 s.size - 1의 개수를 해서 0의 개수와 1의 개수를 한 번에 체크한다.
2. 변환 횟수와 0을 제거한 개수를 변수에 누적한다.
3. '1'의 개수를 2진수 문자열로 변환해서 s를 갱신한다.
2진수 변환 방식으로는 2로 나눈 나머지를 앞에 붙이는 방식으로 구현했다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string toBinary(int n)
{
string result = "";
while(n > 0)
{
result = to_string(n % 2) + result;
n /= 2;
}
return result;
}
vector<int> solution(string s) {
vector<int> answer = {0, 0};
while(s != "1")
{
int one = count(s.begin(), s.end(), '1');
int zero = s.size() - one;
answer[0]++;
answer[1] += zero;
s = toBinary(one);
}
return answer;
}
코드 흐름
1. toBinary함수
string toBinary(int n)
{
string result = "";
while(n > 0)
{
result = to_string(n % 2) + result;
n /= 2;
}
return result;
}
정수를 2진수 문자열로 변환하는 함수를 추가했다.
2로 나눈 나머지를 앞에 붙이는 방식으로 구현했다.
n = 6
6 % 2 = 0 → "0"
3 % 2 = 1 → "10"
1 % 2 = 1 → "110"
2. while 반복
while(s != "1")
s가 "1"만 남을 때까지 반복한다.
3. 1과 0의 개수 계산
int one = count(s.begin(), s.end(), '1');
int zero = s.size() - one;
<algorithm> 헤더에 정의되어 있는 count() 함수를 이용해서 '1'의 개수를 세고, 전체 길이에서 빼면 0의 개수를 한 번에 구할 수 있다.
4. 누적 및 갱신
answer[0]++; // 변환 횟수
answer[1] += zero; // 제거된 0의 총 개수
s = toBinary(one); // 1의 개수를 2진수 문자열로 변환
변환 횟수와 0 제거 개수를 누적하고, s를 새로운 2진수의 문자열로 갱신한다.
핵심 포인트
- while(s != "1")로 종료 조건을 간단하게 표현한다
- '1'의 개수만 세면 s.size() - 1의개수로 0의 개수도 한 번에 구할 수 있다
'Programmers' 카테고리의 다른 글
| <프로그래머스 C++> 카펫 풀이 (브루트포스) (0) | 2026.06.15 |
|---|---|
| <프로그래머스 C++> 피보나치 수 풀이(재귀 함수) (0) | 2026.06.12 |
| <프로그래머스 C++> Jaden Case 문자열 만들기 풀이( toupper(), tolower() ) (0) | 2026.06.10 |
| <프로그래머스 C++> 최댓값과 최솟값 풀이(stringstream, climits) (0) | 2026.06.09 |
| <프로그래머스 C++> 신고 결과 받기 풀이 (0) | 2026.06.08 |