이전 포스팅: 이진 변환 반복하기 (자바)
class Solution {
public int[] solution(String s) {
int[] answer = {0,0};
// s가 "1"이 될 때까지 반복
while(!s.equals("1")) {
// 2진 변환 횟수 카운트 +1
answer[0]++;
// 0이 나오는 횟수 카운트
int oneCnt = 0;
String[] strArr = s.split("");
for(String str : strArr) {
if(str.equals("0")) {
answer[1]++;
} else {
oneCnt++;
}
}
// 문자열 s의 1의 개수를 이진변환 후 s에 대입
String tmp = "";
while(oneCnt!=0) {
if(oneCnt>1) {
tmp = oneCnt%2 +tmp;
oneCnt/=2;
} else if(oneCnt==1) {
tmp = oneCnt+tmp;
oneCnt=0;
}
}
s=tmp;
}
return answer;
}
}
이전의 풀이와 달리, while문을 사용하여 0과 1이 나오는 횟수를 카운트한다.
또한 이전엔 이진 변환을 Integer.toBinaryString(String str)
로 수행하였으나, 이번엔 직접 코딩하였다.
import java.util.Arrays;
class Solution {
public int[] solution(String s) {
int[] answer = {0,0};
// stream은 상수 혹은 그에 준하는값에만 대입 가능해서 final 배열 선언
final String[] strArr = {s};
int excuCnt=0;
final int[] zeroCnt = {0};
// 1이 될때까지 반복
while (!strArr[0].equals("1")) {
excuCnt++;
String[] tempstr={""};
// 0을 제거하며 카운트 올리고 1만 tempstr에 담는다.
Arrays.stream(strArr[0].split("")).forEach(a -> {
if (a.equals("0")) { zeroCnt[0]++; }
else { tempstr[0] += "1"; }
});
// 길이를 2진수로 변환 후 String으로 반환하는 메서드
strArr[0] = Integer.toBinaryString(tempstr[0].length());
}
answer[0]=excuCnt;
answer[1]=zeroCnt[0];
return answer;
}
}
이번 풀이
이전 풀이
성능을 보면 이전의 풀이보다 월등히 빨랐다.
성능 차이의 이유는
Arrays.stream(strArr[0].split(""))
을 사용하여 0을 세고 새로운 문자열에 1을 추가 -> 루프 내에서 문자열을 더하여(tempstr[0] += "1";
)은 새로운 문자열 객체를 계속 생성이렇게 볼 수 있겠다.
이전에 연습겸 stream을 사용 한 것 같다.
하지만 코드는 깔끔해서 가독성이 좋으며, 불필요한 코드가 없어야한다.
깔끔한 코드 작성을 목표로 하자!