입력 값 제한 사항을 보면, 어떤 문자열이 입력값으로 들어오던지 최소 한 번은 변환 과정을 거치기 때문에 do-while문을 사용했다.
문자열 s를 앞에서부터 하나씩 검사한다. "0"이면 count+1, "1"이면 새로운 문자열 변수에 "1"를 붙여써줘서 마치 기존 문자열에서 0을 제거한 것 처럼 만든다.
이 사이에 변환 횟수 +1 했다.
1만 모아놓은 새로운 문자열의 길이를 구하고, for문을 활용해서 이진법으로 바꾼 문자열을 구한다. 사실 이진수로 변환하려면 2로 계속해서 나눴을 때 생기는 나머지 값들을 거꾸로 써야하지만 나의 경우, reverse하는 과정이 귀찮아서 그냥 나머지값들을 문자열에 냅다 박아놓은 후, 거꾸로 복사했다.
그렇게 구한 이진수를 가지고 1, 2번 과정을 "1"이 될 때까지 반복한다.
반복이 끝났다면 1번 과정에서 구한 0 제거 횟수와, 변환 횟수를 배열에 넣어서 반환한다.
import java.util.*;
class Solution {
public int[] solution(String s) {
int[] answer = new int[2];
int zeroCount = 0; // 제거한 0의 개수
int changeCount = 0;
String newStr = "";
do{
for(int i=0;i<s.length();i++){
if(s.charAt(i) == '0'){
zeroCount++;
}
else{
newStr += "1";
}
}
String binaryStr = "";
s = newStr;
newStr = ""; //초기화
//이진변환
int c = s.length();
while(c!=0){
binaryStr += (c%2);
c /= 2;
}
changeCount++; //이진변환 횟수 +1
s = "";
for(int i=binaryStr.length()-1;i>=0;i--){
s += binaryStr.charAt(i); //거꾸로 저장된 이진수 변환
}
}while(!s.equals("1"));
answer[0] = changeCount;
answer[1] = zeroCount;
return answer;
}
}
처음에 변환 횟수가 기댓값보다 -1만큼 나와서 헤맸다. 알고보니 입력값이 "1"이어도 변환 과정은 무조건 한 번은 count된다는 것을 간과한 것이 원인이었다.