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 | result |
---|---|
"110010101001" | [3,8] |
"01110" | [3,3] |
"1111111" | [4,1] |
class Solution {
public int[] solution(String s) {
int[] answer = new int[2];
int cnt = 0;
int zeroCnt = 0;
while(!s.equals("1")){
int oneCnt = 0;
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) == '1'){
oneCnt++;
}else{
zeroCnt++;
}
}
s = Integer.toBinaryString(oneCnt);
cnt++;
}
answer[0] = cnt;
answer[1] = zeroCnt;
return answer;
}
}
우선 이진 변환의 횟수 cnt
와 제거된 0의 갯수인 zeroCnt
를 선언해준다. 그리고 문자열 s
가 1이 될 때까지 while
문을 반복해 주는데,
이 때 while
문 내부에 1의 갯수인 oneCnt
를 선언해준다. 문자열에서 0을 제거한 문자열의 길이를 다시 이진 변환 해주어야 하는데 0을 제거하게 되면 문자열에는 1만 남게 되므로 문자열 내의 1의 갯수 = 0을 제거한 문자열의 길이
이다. 따라서 각 상황에 맞게 if
문으로 oneCnt
와 zeroCnt
를 증가시킨 후에 다시 oneCnt
를 toBinaryString
메서드를 사용해 이진 변환한 후 문자열 형태로 s
에 담아준다. 그리고 이것을 한 번 반복할 때마다 cnt
의 값을 1 증가시킨다. 이렇게 s
가 1이 될 때 까지 while
문을 반복 해 준 후에, 배열 answer
의 0번째에는 cnt
를, 1번째에는 zeroCnt
를 담아 리턴해주면 된다.