[프로그래머스] 이진 변환 반복

JIHYUN·2021년 9월 16일
0

📌이진 변환 반복

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

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

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

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

📌제한사항

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

📌입 출력 예

sresult
"110010101001"[3,8]
"01110"[3,3]
"1111111"[4,1]

📌사용 언어 : JAVA

📌solution

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        int cnt = 0;
        int zeroCnt = 0;
        
        while(!s.equals("1")){
            int oneCnt = 0;
            for(int i = 0; i < s.length(); i++){
                if(s.charAt(i) == '1'){
                    oneCnt++;
                }else{
                    zeroCnt++;
                }
            }
            s = Integer.toBinaryString(oneCnt);
            cnt++;
        }
        answer[0] = cnt;
        answer[1] = zeroCnt;
        
        return answer;
    }
}

😎풀이

우선 이진 변환의 횟수 cnt와 제거된 0의 갯수인 zeroCnt를 선언해준다. 그리고 문자열 s가 1이 될 때까지 while문을 반복해 주는데,
이 때 while문 내부에 1의 갯수인 oneCnt를 선언해준다. 문자열에서 0을 제거한 문자열의 길이를 다시 이진 변환 해주어야 하는데 0을 제거하게 되면 문자열에는 1만 남게 되므로 문자열 내의 1의 갯수 = 0을 제거한 문자열의 길이이다. 따라서 각 상황에 맞게 if문으로 oneCntzeroCnt를 증가시킨 후에 다시 oneCnttoBinaryString 메서드를 사용해 이진 변환한 후 문자열 형태로 s에 담아준다. 그리고 이것을 한 번 반복할 때마다 cnt의 값을 1 증가시킨다. 이렇게 s가 1이 될 때 까지 while문을 반복 해 준 후에, 배열 answer의 0번째에는 cnt를, 1번째에는 zeroCnt를 담아 리턴해주면 된다.

profile
이것저것 공부중

0개의 댓글