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

김재현·2024년 5월 21일
0

알고리즘 풀이

목록 보기
88/90
post-thumbnail

이전 포스팅: 이진 변환 반복하기 (자바)

문제

정답 코드

class Solution {
    public int[] solution(String s) {
        int[] answer = {0,0};
        
        // s가 "1"이 될 때까지 반복
        while(!s.equals("1")) {

			// 2진 변환 횟수 카운트 +1
            answer[0]++;
            
            // 0이 나오는 횟수 카운트
            int oneCnt = 0;
            String[] strArr = s.split("");
            for(String str : strArr) {
                if(str.equals("0")) {
                    answer[1]++;
                } else {
                    oneCnt++;
                }
            }
            
            // 문자열 s의 1의 개수를 이진변환 후 s에 대입
            String tmp = "";
            while(oneCnt!=0) {
                if(oneCnt>1) {
                    tmp = oneCnt%2 +tmp;
                    oneCnt/=2;
                } else if(oneCnt==1) {
                    tmp = oneCnt+tmp;
                    oneCnt=0;
                }
            }
            s=tmp;
        }
        
        return answer;
    }
}

이전의 풀이와 달리, while문을 사용하여 0과 1이 나오는 횟수를 카운트한다.
또한 이전엔 이진 변환을 Integer.toBinaryString(String str)로 수행하였으나, 이번엔 직접 코딩하였다.

이전 풀이

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;
    }
}

이번 풀이

이전 풀이

성능을 보면 이전의 풀이보다 월등히 빨랐다.

성능 차이의 이유는

  1. 스트림 연산으로 처리 -> 스트림 객체가 반복적으로 생성
  2. Arrays.stream(strArr[0].split(""))을 사용하여 0을 세고 새로운 문자열에 1을 추가 -> 루프 내에서 문자열을 더하여(tempstr[0] += "1";)은 새로운 문자열 객체를 계속 생성

이렇게 볼 수 있겠다.

이전에 연습겸 stream을 사용 한 것 같다.
하지만 코드는 깔끔해서 가독성이 좋으며, 불필요한 코드가 없어야한다.

깔끔한 코드 작성을 목표로 하자!

profile
I live in Seoul, Korea, Handsome

0개의 댓글