꾸물꾸물 졔의 개발공부

[프로그래머스] 이진 변환 반복하기 - JAVA (월간 코드 챌린지 시즌 1 본문

알고리즘/프로그래머스

[프로그래머스] 이진 변환 반복하기 - JAVA (월간 코드 챌린지 시즌 1

체제 2023. 9. 6. 10:06

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

💡deleteZero(String s) : s에 포함된 0의 갯수를 카운트 하고, 0을 모두 제거하는 메소드 

- s.charAt(i) : s의 i번째 인덱스의 문자 
- s.replace(a, b) : s에 포함되어 있는 a 문자/문자열 "전부"를 b로 변환 
- 1. s의 문자를 앞에서부터 차례대로 탐색하여 만약 '0' 일 경우 제거되는 0갯수 카운트 ++ 
- 2. 모두 카운트 했다면 s에 포함된 "0"을 모두 공백("")으로 변환 

 

💡changeBin(int num) : num을 2진법으로 변환 (num == s.length(), s의 길이)

- String change : num을 2진법으로 변환한 문자열을 저장할 변수 
- 1. num을 2로 나눈 나머지는 change의 앞쪽에 더하고, num을 2로 나눈 몫은 num에 저장 
- 2. num이 1이 되기전까지 1번 과정을 반복하다가, 1이 되면 change의 가장 앞쪽에 1(=num)붙이기

 

s가 1이 되기전까지 deleteZero() ▶changeBin() 반복하며 제거하는 0의 갯수, 반복 횟수 카운트 

 


 

[소스 코드]

class Solution {
    static int delete=0; 
    static int change=0; 
    public int[] solution(String s) {
        int[] answer = new int[2];
        while(!s.equals("1")){
            change++; 
            s= deleteZero(s); //모든 0제거하기 
            s= changeBin(s.length()); //s의 길이를 2진법으로 변환 
        }
        answer[0]= change; answer[1]= delete; 
        return answer;
    }
    
    //s에 포함된 0 갯수 카운트 + 모든 0 제거 
    public String deleteZero(String s){
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i) == '0') delete++; 
        }
        
        s= s.replace("0", ""); 
        return s; 
    }
    //s의 길이를 2진법으로 변환 
    public String changeBin(int num){
        //몫이 1이면 종료 , 
        String change ="";
        while(num!=1){
            change = num%2+change; 
            num/=2;
        }           
        change = num +change;
        return change; 
    }
}