코딩 테스트/자바

[프로그래머스 / 자바 / Lv.2] 70129 이진 변환 반복하기

HHRR 2024. 7. 24. 15:53
문제

 

풀이

 

입력값에서 0을 제거하고

->  0 제거 후 길이를 다시 이진변환

-> 이진변환한 수에서 다시 0을 제거

-> 0 제거 후 길이를 다시 이진변환

하는 것을 반복해서 이진변환 결과가 1이 될 때까지 반복해야한다.

출력값으로는 [{총 반복 횟수}, {제거한 0의 개수}] 를 출력해야한다.

 

변수 설명

- len : 0 제거후 길이

- zero : 제거한 0의 개수 카운터

- count : 반복 횟수 카운터

 

풀이 순서

class Solution {
    static int zero = 0;
    static int count = 0;

    public int[] solution(String s) {
        convert(s);
        int[] answer = {count, zero};
        return answer;
    }

    private void convert(String s) {
        count ++;
        int len = 0;
        for (char c: s.toCharArray()){
            if (c == '1') len ++; // 0 제거후 길이
            else zero++; // 제거할 0의 개수
        }
        if (len == 1) return; // 이진 변환 결과 1이면 종료
        s = Integer.toBinaryString(len); // 2진수 변환 함수
        convert(s); // 재귀함수
    }
}

 

solution 함수

convert 함수를 호출하고 함수가 종료되면 카운터 값인 count와 zero를 반환해준다.

 

convert 함수

1. 입력값을 toCharArray()로 하나하나 순회한다.

2. 문제에서 0 제거후 길이를 다시 이진변환해야하는데, 이는 1의 개수와 똑같으므로 값이 1일 경우에 `len`을 증가시켜준다.

3. 제거한 0의 개수를 출력해줘야하므로, 입력값이 1이 아니면 `zero`를 증가시켜준다.

4. 이 때 이진변환 결과가 1이 될 때는 len이 1인 경우이므로 이 경우에 함수를 종료시켜준다.

5. len을 다시 이진변환해줘야 하는데, 이 때 `Integer.toBinaryString(len)` 을 써서 이진변환 해줬다.

6. 변환값을 convert 함수에 넣어서 재귀호출 해준다. 함수 호출시 `count`를 증가시킨다.