문제는 다음과 같다.
https://school.programmers.co.kr/learn/courses/30/lessons/70129
풀이는 다음과 같다.
class Solution {
static int[] answer = {0, 0};
public int[] solution(String s) {
while(true) {
int num = destroy0(s);
s = binary(num);
answer[0]++;
if(s.equals("1")) break;
}
return answer;
}
static int destroy0(String s) { //String에서 0 없에기
String a = s.replace("0", "");
int num = s.length() - a.length();
answer[1] += num;
return a.length();
}
static String binary(int num) { //숫자를 2진수 String으로 반환
if(num == 1) return "1";
int v = 1;
int l = 0;
while(true) {
v = 2*v;
l++;
if(v > num) break;
}
char[] arr = new char[l];
while(num > 1) {
int b = 1;
int c = 0;
while(true) {
b = 2*b;
c++;
if(num <= b) break;
}
if(num != b) {
b = b/2;
c--;
}
num = num-b;
arr[l-c-1] = '1';
}
if(num == 1) arr[l-1] = '1';
for(int i = 0 ; i < arr.length ; i++) {
if(arr[i] != '1') {
arr[i] = '0';
}
}
String s = new String (arr);
System.out.println(s);
return s;
}
}
결코 어려운 문제가 아니다.
위 과정을 2진수 "1"이 나올때까지 하면 된다.
나는 첫번쨰 과정을 destroy0
함수로 구현했고,
두번째 과정을 binary
함수로 구현했다.
풀면서 디버깅을 세가지를 했다.
arr[l-c-1] = '1';
if(num == 1) arr[l-1] = '1';
return a.length();
다른 풀이 (더 쉬움)
나는 2진수를 구하는 함수binary
를 만들어서 사용했지만,
2진수를 바로 String형태로 만들어주는 자바 내장 함수가 있다.
바로 Integer.toString(숫자, 진수);
이고,
해당 방식을 사용한 풀이는 훨씬 간결하다.
class Solution {
static int[] answer = {0, 0};
public int[] solution(String s) {
while(true) {
int num = destroy0(s);
//여기 사이 바뀜, 여기 사이 바뀜, 여기 사이 바뀜.
s = Integer.toString(num, 2);
//여기 사이 바뀜, 여기 사이 바뀜, 여기 사이 바뀜.
answer[0]++;
if(s.equals("1")) break;
}
return answer;
}
static int destroy0(String s) { //String에서 0 없에기
String a = s.replace("0", "");
int num = s.length() - a.length();
answer[1] += num;
return a.length();
}
}