티스토리 뷰

문제 설명

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

x의 모든 0을 제거합니다.
x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.

0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.

문제 : https://school.programmers.co.kr/learn/courses/30/lessons/70129


제한 사항

  • s의 길이는 1 이상 150,000 이하입니다.
  • s에는 '1'이 최소 하나 이상 포함되어 있습니다.

입출력 예


소스 코드

class Solution {
    public int[] solution(String s) {

        int calcCount = 0;
        int zeroCount = 0;

        //재귀함수 호출
        return binaryCalc(s, calcCount, zeroCount);
    }

    //재귀 메서드
    private int[] binaryCalc(String s, int calcCount, int zeroCount) {

        int[] result = {};

        //zeroCount를 계산할 for문
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == '0') {
                zeroCount++;
            }
        }

        //zeroCount를 계산했으니 제거 후 이진법 진행
        String replaceStr = s.replace("0","");
        int length = replaceStr.length();
        //이진법 계산한 문자열
        String binaryString = Integer.toBinaryString(length);

        // 한번의 과정이 끝났으면 +1
        calcCount += 1;

        //만약 이진법으로 계산한 문자열이 "1"일 경우 result 반환(문제 요구 사항)
        if (binaryString.equals("1")) {
            result = new int[]{calcCount, zeroCount};
            return result;
        }

        //해결될 때 까지 반복
        return binaryCalc(binaryString, calcCount, zeroCount);
    }
}

문제 풀이 과정

재귀함수를 사용해 풀어볼 생각을 하였다.

  1. 문자열 s 0의 갯수를 계산할 "zeroCount" 변수로 만듬
  2. 한번의 과정을 진행하면 +1 할 "calcCount" 변수로 만듬
  3. 재귀 함수 "binaryCalc" 호출
  4. "binaryCalc" 메서드 진행
  5. zeroCount 계산할 공식
  6. zeroCount 계산 후 calcCount+1
  7. 문자열 "s" 이진법으로 만듬
  8. 만약 문자열 "s"가 "1"일 경우 result 배열안에 calcCount, zeroCount를 채운 후 종료(문제 요구사항)

결과

'사견 > 알고리즘' 카테고리의 다른 글

[프로그래머스/Java] Level 2. 다음 큰 숫자  (0) 2023.05.13
[프로그래머스/Java] Level 2. 숫자의 표현  (0) 2023.05.12
[Java] 더하기 사이클  (0) 2022.07.02
[Java] 소수 구하기  (0) 2022.06.30
[Java] ACM 호텔  (0) 2022.06.30
Comments