프로그래머스/Lv. 2

[프로그래머스 코딩테스트] 이진 변환 반복하기(Java)

Sigfriede 2023. 6. 20. 01:00

  문제 설명

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

  1. x의 모든 0을 제거합니다.
  2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.

  예를 들어 x = "0111010"이라면,  x에 이진 변환을 가하면 x = "011101" -> "1111" -> "100"이 됩니다.

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

 

  제한사항

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

 

  입출력 예

s result
"110010101001" [3, 8]
"01110" [3, 3]
"1111111" [4, 1]
class Solution {
    public int[] solution(String s) {
        int count = 0;
        int zero = 0;
        while (s != "1") {
            count++;
            int one = 0;
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == '0') {
                    zero++;
                } else {
                    one++;
                }
            }
            s = Integer.toBinaryString(one);
            if (one == 1) {
                break;
            }
            one = 0;
        }
        int[] answer = {count, zero};
        return answer;
    }
}

  변수 count와 zero를 생성합니다. 이는 각각 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 담을 것입니다.

  while문은 s가 1이 아닌 동안 반복합니다.

  while문이 작동했으므로 count가 증가합니다.

  변수 one을 생성합니다. 이는 1의 개수를 세어 변환할 문자열의 길이를 확인할 변수입니다.

  첫 번째 if문에서 s의 i번째 문자가 0이라면 zero가 증가합니다. 문자열에는 0과 1만 존재하므로 0이 아니라면 1이라는 뜻입니다. 띠리서 one이 증가합니다.

  Integer 클래스의 toBinaryString 메소드를 이용하여 one, 즉 1의 개수만큼을 이진법으로 변환하고 s에 할당하여 갱신할 것입니다.

  두 번째 if문에서 one이 1이라면 문제에서 제시하는 s가 "1"이 될 때까지를 의미하므로 break를 이용하여 반복문을 빠져나옵니다.

  one을 0으로 초기화하여 다음 반복에서 1의 개수를 올바르게 셀 수 있도록 합니다.

  answer 배열을 생성하고 answer의 0 번째 인덱스에는 이진 변환의 횟수를, answer의 1 번째 인덱스에는 변환 과정에서 제거된 모든 0의 개수를 담아 반환하도록 합니다.