티스토리 뷰

더보기

문제

 

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'이 최소 하나 이상 포함되어 있습니다.

  

문제를 보고 이진수..? 계산을 내가 구현해야 하는 건가? 싶었는데 다행히도 함수가 있더군요!

안도하며 알고리즘부터 짜줬습니다..

 

1. 문자열 나누기
2. 제거할 0의 개수와 회차 기록을 위한 변수 선언
3. str 이진 변환 시작⬇️
3-1. 0의 개수 파악
3-2. str에서 0 제거

더보기

0을 제거하는 걸 리스트로 변환 -> .remove()로 0 지우기 vs 필터 사용해서 하기 중 고민하다가 아직 낯선 filter를 사용해보았습니다.

str = Arrays.stream(str) //str에서
            .filter(out -> !out.equals("0")) //out이 "0"이 아닌 것들을 모아
            .toArray(String[] ::new); //다시 String[] str로 생성한다

3-3. 0이 제거되고 생긴 새로운 str의 길이 파악
3-4. 이진수로 변경

더보기

이진수로 변경하는 건 생각보다 간단하더라구요.

String s = Integer.toBinaryString(int num);

 

이렇게 하면 이진수로 변환된 값이 s에 저장됩니다.

3-5. 라운드 +1
4. str의 길이가 1이 될 때까지 반복

 

 

 

코드 전문입니다.

import java.util.*;
import java.util.stream.*;

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

        int zeroCnt = 0;
        int round = 0;
        
        while(true){
            String[] str = s.split("");
            
            if(str.length == 1) break;
            
            for(String zero : str){
                if(zero.equals("0")) zeroCnt++;
            }
            
            str = Arrays.stream(str)
            .filter(out -> !out.equals("0"))
            .toArray(String[] ::new);
            
            s = Integer.toBinaryString(str.length);
            round ++;
        }
        
        int[] answer = {round, zeroCnt};
        return answer;
    }
}

 

꺅 거의 처음으로 한번에 성공해서 기분이 좋습니다ㅎㅎ