이진 변환 반복하기 (자바)

김재현·2023년 12월 14일
0

알고리즘 풀이

목록 보기
52/89
post-custom-banner

문제

정답 코드

import java.util.Arrays;

class Solution {
    public int[] solution(String s) {
        int[] answer = {0,0};

        // stream은 상수 혹은 그에 준하는값에만 대입 가능해서 final 배열 선언
        final String[] strArr = {s};

        int excuCnt=0;
        final int[] zeroCnt = {0};

        // 1이 될때까지 반복
        while (!strArr[0].equals("1")) {
            excuCnt++;

            String[] tempstr={""};

            // 0을 제거하며 카운트 올리고 1만 tempstr에 담는다.
            Arrays.stream(strArr[0].split("")).forEach(a -> {
                if (a.equals("0")) { zeroCnt[0]++; }
                else { tempstr[0] += "1"; }
            });

            // 길이를 2진수로 변환 후 String으로 반환하는 메서드
            strArr[0] = Integer.toBinaryString(tempstr[0].length());
        }
        
        answer[0]=excuCnt;
        answer[1]=zeroCnt[0];

        return answer;
    }
}

이전에 올렸던 것 처럼 stream은 상수 혹은 그에 준하는값에만 대입 가능해서 위와 같이 배열에 굳이굳이 대입해서 사용했다.

10진수를 2진수으로 변환하는 메서드가 있을 것 같아 찾아보니,
10진수를 2진수로 바꾼 뒤 String으로 반환하는 Integer.toBinaryString() 가 있어서 사용했다.

다른 사람 풀이

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        int temp;
        while( !s.equals("1") ) {
            answer[1] += s.length();
            s = s.replaceAll("0", "");
            temp = s.length();
            s = Integer.toBinaryString(temp);
            //System.out.println("s : " + s ); 
            answer[0]++;
            answer[1] -= temp;
        }
        return answer;  
    }
}

생각해보니 split을 하지 안고 바로 replaceAll()을 사용했다면 0을 제거할 수 있었을텐데!
이걸 생각해내지 못하다니 아쉽다.

profile
I live in Seoul, Korea, Handsome
post-custom-banner

0개의 댓글