[Programmers] 이진 변환 반복하기(Java) - 재귀, 참조에 의한 전달

이동기·2024년 10월 6일
1

이번에는 프로그래머스에서 이진 변환 반복하기 문제를 풀어보았습니다.

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);
    }
}
profile
개발자가 되고 싶은 '개'발자입니다. https://github.com/lee-dong-gi

0개의 댓글