처음엔
1) binary 메서드로, 주어진 s에 0을 빼고, 남은 1의 개수를 이진법으로 반환하고, 뺀 0의 개수를 반환하는 메서드인 binary()를 만들고
2) solution메서드에서 s가 1이될때가지 binary메서드를 반복하고 binary 메서드를 몇번 호출했는지와, 총 뺀 0의 개수를 return하면되겠거니 해서 이렇게 풀었다.
ㅇ 오늘의 풀이(오답)
class Solution {
public int[] solution(String s) {
int zeroCnt = 0; // 누적된 0의 개수를 저장할 변수
int biCnt = 0; //binary 메서드를 몇번반복했는가를 저장할 변수
while (!s.equals("1")) { // 문자열이 "1"이 될 때까지 반복
int[] result = binary(s); // binary 메서드 호출
s = String.valueOf(result[0]); // 새로운 문자열로 갱신
zeroCnt += Integer.parseInt(String.valueOf(result[1])); // 누적된 0의 개수 갱신
biCnt++; // 반복 횟수 증가
}
return new int[]{biCnt, zeroCnt};
}
public static int[] binary(String a) {
int cnt = 0;
String answer = "";
for(int i = 0; i < a.length(); i++){
if(a.charAt(i) == '0'){
cnt++;
}
else{
answer += a.charAt(i);
}
}
int[] result = new int[2];
result[0] = Integer.parseInt(Integer.toBinaryString(answer.length())); // 0을 제외한 나머지 문자열을 이진수로 변환하여 저장
result[1] = cnt; // 0의 개수 저장
return result;
}
}
이렇게 했더니, 정답은 나오지만, 몇개의 테스트케이스에서 런타임에러가 떴다. 내 예상이지만 메서드로 따로 만들고 형변환이 너무 잦다는 점에서 런타임 에러가 뜬거 같다.
하나의 메서드에서 풀었던 과거의 풀이를 다시 보자.
ㅇ 과거풀이(정답)
public int[] solution(String s) {
int[] answer = {}; //정답을 담을 배열 초기화
int transCount = 0; // 0빼고 남은1의개수만큼을 2진법한 횟수
int zeroCount = 0; // 과정중 뺀 0의 총 갯수
while(true){
if(s.equals("1")) break; // s가 1이되면, 반복 그만
zeroCount += s.length()-s.replace("0","").length(); //0의갯수를 구한다.
s = s.replace("0",""); //s에서 0을 빼준다.
s = Integer.toBinaryString(s.length()); //0을뺀 s의길이를 2진법으로 바꾼다.
transCount++;
}
return new int[] {transCount,zeroCount};
}
이번에 내가 푼 코드보다 반이상 짧다. 하지만 성능은 훨씬 좋다.
어떻게 풀었는지 보자.
진짜 왜 이렇게 진작 못풀었을까? 정말 한심하다. 알고리즘을 너무 쉬운것만 풀었더니 지능이 떨어졌다. 내일 다시 풀어봐야겠다.