프로그래머스 이진 변환 반복하기 자바

꾸준하게 달리기~·2023년 8월 30일
0
post-thumbnail

문제는 다음과 같다.
https://school.programmers.co.kr/learn/courses/30/lessons/70129

풀이는 다음과 같다.

class Solution {
    static int[] answer = {0, 0};
    public int[] solution(String s) {
        
        while(true) {
            int num = destroy0(s);
            s = binary(num);
            answer[0]++;
            if(s.equals("1")) break;
        }
        
        return answer;
    }
    
    static int destroy0(String s) { //String에서 0 없에기
        String a = s.replace("0", "");
        int num = s.length() - a.length();
        answer[1] += num;
        return a.length();
        
    }
    
    static String binary(int num) { //숫자를 2진수 String으로 반환
        if(num == 1) return "1";
        
        int v = 1;
        int l = 0;
        
        while(true) {
            v = 2*v;
            l++;
            if(v > num) break;
        }
        
        char[] arr = new char[l];
        
        
        
        while(num > 1) {
            int b = 1;
            int c = 0;
            
            while(true) {
                b = 2*b;
                c++;
                if(num <= b) break;
            }
            
            if(num != b) {
                b = b/2;
                c--;
            }
            
            num = num-b;
            arr[l-c-1] = '1';
        }
        
        if(num == 1) arr[l-1] = '1';
        for(int i = 0 ; i < arr.length ; i++) {
            if(arr[i] != '1') {
                arr[i] = '0';
            }
        }
        
        String s = new String (arr);
        System.out.println(s);
        
        return s;
    }
}

결코 어려운 문제가 아니다.

  • 주어진 수에서 0을 제거하고,
    (ex : 1001 -> 11)
  • 0을 제거한 수의 길이를 구한 후, 그 길이를 또다시 2진수로 변환한다.
    (ex : 11 길이 2, 2를 2진수로 -> 10)

위 과정을 2진수 "1"이 나올때까지 하면 된다.

나는 첫번쨰 과정을 destroy0 함수로 구현했고,
두번째 과정을 binary 함수로 구현했다.




풀면서 디버깅을 세가지를 했다.

  1. 배열 index 생각했어야함. new String (arr) 하면, 처음부터 나온다는것.
arr[l-c-1] = '1';
  1. 이진수 만들때, 숫자가 짝 홀에 따라 이진수의 마지막 값 변경해주지 않음.
if(num == 1) arr[l-1] = '1';
  1. 0을 제거하고 남은 길이를 반환해야하는데, 0의 제거 수를 반환함.
return a.length();

다른 풀이 (더 쉬움)
나는 2진수를 구하는 함수binary를 만들어서 사용했지만,
2진수를 바로 String형태로 만들어주는 자바 내장 함수가 있다.
바로 Integer.toString(숫자, 진수); 이고,
해당 방식을 사용한 풀이는 훨씬 간결하다.

class Solution {
    static int[] answer = {0, 0};
    public int[] solution(String s) {
        
        while(true) {
            int num = destroy0(s);
            //여기 사이 바뀜, 여기 사이 바뀜, 여기 사이 바뀜.
            s = Integer.toString(num, 2);
            //여기 사이 바뀜, 여기 사이 바뀜, 여기 사이 바뀜.
            answer[0]++;
            if(s.equals("1")) break;
        }
        
        return answer;
    }
    
    static int destroy0(String s) { //String에서 0 없에기
        String a = s.replace("0", "");
        int num = s.length() - a.length();
        answer[1] += num;
        return a.length();
        
    }
    
}
profile
반갑습니다~! 좋은하루 보내세요 :)

0개의 댓글