이번에는 프로그래머스에서 이진 변환 반복하기 문제를 풀어보았습니다.
2진수를 나타내는 문자열을 대상으로 0을 제거한 뒤 그 문자열의 길이를 2진수로 변환하는 작업을 "1"만 남을때까지 반복합니다. 반복 과정에서 몇 번 반복했고 0을 얼마나 제거했는지 추출하는 문제였습니다.
일단 보자마자 재귀함수가 떠올랐고 Java 기본 라이브러리인 유틸리티 메서드만을 사용하여 util 패키지를 import 할 필요도 없었던 것 같습니다.
주의할점은 '이진 변환의 횟수'와 '제거된 모든 0의 개수'를 재귀함수에 전달하여 구하고자 할 때 래퍼타입 클래스를 사용하더라도 불변 객체라서 참조에 의한 전달(pass-by-reference)이 적용되지 않아 결과가 계속 0으로 나옵니다. 그래서 AtomicInteger로 객체를 만들거나 int 배열을 만들어서 강제적으로 참조에 의한 전달 상황을 만들어주어야합니다.
public class Solution {
public int[] solution(String s) {
int[] counts = {0, 0};
binaryConvert(s, counts);
return counts;
}
private static void binaryConvert(String target, int[] counts) {
char[] targetCharArray = target.toCharArray();
for (char val : targetCharArray) {
if ('0' == val) {
counts[1]++;
}
}
String rmZeroTarget = target.replace("0", "");
int len = rmZeroTarget.length();
String binaryString = Integer.toBinaryString(len);
counts[0]++;
if ("1".equals(binaryString)) {
return;
}
binaryConvert(binaryString, counts);
}
}