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

hyunnzl·2025년 7월 18일

프로그래머스

목록 보기
46/58
post-thumbnail

https://school.programmers.co.kr/learn/courses/30/lessons/70129

난이도

Level 2

문제

코드

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[]{0, 0};
        
        while(!s.equals("1")){
            answer[0]++;
            int[] one = countOne(s);
            answer[1] += one[1];
            s = translate(one[0]);
        }
        return answer;
    }
    
    public int[] countOne(String s){
        int len = 0;
        for(int i = 0; i < s.length(); i++){
            len += s.charAt(i) == '1' ? 1 : 0;
        }
        return new int[]{len, s.length() - len};
    }
    
    public String translate(int s){
        StringBuilder sb = new StringBuilder();
        while(s > 1){
            int remain = s % 2;
            sb.append(remain);
            s /= 2;
        }
        if(s == 1) sb.append(1);
        return sb.reverse().toString();
    }
}

너무 복잡하게 푼거 같아서 간결한 버전을 찾아봤다.

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];

        while (!s.equals("1")) {
            int originalLength = s.length();
            s = s.replace("0", "");         // 0 제거 후
            answer[1] += originalLength - s.length();  // 제거된 0의 개수 누적
            s = Integer.toBinaryString(s.length());    // 1의 개수를 2진수로 변환
            answer[0]++;                   // 변환 횟수 증가
        }

        return answer;
    }
}

0개의 댓글