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 함수를 완성해주세요.
s의 길이는 1 이상 150,000 이하입니다.
s에는 '1'이 최소 하나 이상 포함되어 있습니다.
s "110010101001"
result [3,8]
s "01110"
result [3,3]
s "1111111"
result [4,1]
110010101001이 1이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 110010101001 6 6 110
2 110 1 2 10
3 10 1 1 1
3번의 이진 변환을 하는 동안 8개의 0을 제거했으므로, [3,8]을 return 해야 합니다.
01110이 1이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 01110 2 3 11
2 11 0 2 10
3 10 1 1 1
3번의 이진 변환을 하는 동안 3개의 0을 제거했으므로, [3,3]을 return 해야 합니다.
1111111이 1이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 1111111 0 7 111
2 111 0 3 11
3 11 0 2 10
4 10 1 1 1
4번의 이진 변환을 하는 동안 1개의 0을 제거했으므로, [4,1]을 return 해야 합니다.
문제에서 정한 이진변환의 정의에 대해 한번 더 정리했다.
문제의 이 부분을 보자.
x의 모든 0을 제거합니다.
x의 길이를 c라고 하면, x를 c를 2진법으로 표현한 문자열로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
1️⃣ 주어진 x의 0을 모두 제거한다.
2️⃣ 0을 제거한 x의 길이를 구해서 2진법으로 바꾼다.
3️⃣ 이때, 1번에서 제거한 0의 갯수를 저장해둔다.
4️⃣ 1~3번이 반복되는 횟수를 저장해둔다.
5️⃣ 3,4번을 통해 저장된 값을 반환하면 끝 👋
class Solution {
static int zeroCount = 0;
public int[] solution(String s) {
int[] answer = {};
int convertCount = 0;
while(true){
convertCount++;
int a = convertNumber(s);
if(a!=1){
s = convertOneZero(a);
}else if(a==1){
break;
}
}
answer = new int [] {convertCount, zeroCount};
return answer;
}
public static int convertNumber(String s){
String result = "";
for(int i=0; i<s.length(); i++){
if(s.substring(i,i+1).contentEquals("1")){
result+="1";
}else{
zeroCount++;
}
}
return result.length();
}
public static String convertOneZero(int a){
String result="";
while(a>0){
if(a==1 || a==0){
result = a + result;
break;
}else{
result = a%2 + result;
a = a/2;
}
}
return result;
}
}
처음 입력받은 2진법 문자를 0제거하고 그 길이를 반환하는 convertNumber 메소드와
convertNumber에서 반환된 길이를 1인지 비교하여 다시 2진법으로 변환하는 convertOneZero 메소드를 이용하였다.
while로 계속 반복하며 문자의 길이가 1이될때까지 반복한다.
너무나도 좋은 풀이들이 많아서 나느 좀 장황한 코드가 되었다..