나만의 작은 도서관
문제 70129. 이진 변환 반복하기 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/70129
난이도 : Lv.2
문제 요약 설명
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
- x의 모든 0을 제거합니다.
- x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
입력
- 0과 1로 이루어진 문자열 s
입력 제한
- s의 길이는 1 이상 150,000 이하입니다.
- s에는 '1'이 최소 하나 이상 포함되어 있습니다.
입력 예제
// input
"110010101001"
// ans
[3,8]
풀이 방식
해당 문제는 구현 유형 문제이므로, 문제에서 요구하는 대로 작성하면 된다. 따라서 아래의 과정을 1이 나올때까지 반복한다.
- 현재 문자열 s에서 0의 개수를 cnt에 저장하고, 제거한 0의 개수 변수 cnt_zero에 cnt만큼 더한다.
- 현재 문자열 s에서 1의 개수를 구하고(s의 길이 - 0의 개수) 1의 개수를 이진수로 변환한다.
- while루프를 반복한 횟수를 저장하는 loop를 1증가시킨다.
while루프가 종료되면 cnt_zero와 loop를 통해 answer를 반환한다.
정답 코드
더보기
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
vector<int> solution(string s) {
vector<int> answer;
int cnt_zero = 0, cnt, num;
int loop = 0;
while(s != "1"){
cnt = 0;
for(char c : s){
if(c == '0'){
cnt++;
}
}
num = s.length() - cnt;
cnt_zero += cnt;
s = "";
while(num > 0){
s += (num % 2) + '0';
num /= 2;
}
reverse(s.begin(), s.end());
cout << s << '\n';
loop++;
}
answer = {loop, cnt_zero};
return answer;
}
'프로그래머스 문제풀이 > 코드카타' 카테고리의 다른 글
문제 42842. 카펫 (0) | 2024.07.02 |
---|---|
문제 12945. 피보나치 수 (0) | 2024.07.01 |
문제 12951. JadenCase 문자열 만들기 (0) | 2024.06.29 |
문제 12939. 최댓값과 최솟값 (0) | 2024.06.28 |
문제 92334. 신고 결과 받기 (0) | 2024.06.27 |