JAVAIARY

프로그래머스 ) 이진 변환 반복하기 본문

examplePractice

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

shiherlis 2023. 4. 4. 17:42

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

 

프로그래머스

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

programmers.co.kr

 

import java.util.ArrayList;

class Solution {
	public static int[] solution(String s) {
		int zeroCnt = 0;
		int cnt =0;
		
		while(!s.equals("1")) {
			int num = 0; // 1 개수 == 숫자
			// 0 제거
			for (int i = 0; i < s.length(); i++) {
				
				if (s.charAt(i) == '1') {
					num += 1;
				}else {
					zeroCnt++;
				}
			}
			StringBuffer sb = new StringBuffer();
			// 2진수로 변환
			while (num / 2 != 0) {
				if (num%2 == 0) {
					sb.append('0');
				}else {
					sb.append('1');
				}
				num /= 2;
			}
			sb.append('1');
			//뒤집어서 s에 재할당
			s= sb.reverse().toString();
				cnt++;
		}
		
		
		int[] answer = {cnt,zeroCnt};
		return answer;
	}
}
  • toBinaryString() 함수를 모르기도 했고, 함수 알고난 뒤에도 오기가 생겨서 따로 이진수 만들어 주도록 했다. 
  • 원래 이진수를 만드는 이론처 계속 2로 나누어 그 나머지를 채택하는 방식으로 구현
  • 처음에는 ArrayList를 사용하여 뒤집을 때도 반복문이 필요했는데,
    StringBuffer에 reverse() 기능이 있다는 것을 알게되어 스트링 버퍼를 채택하였다.

 

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        int zeroCount=0, count=0;
        
        while(!s.equals("1")){
            String num = "";
            for(int i=0; i<s.length(); i++){
                if(s.charAt(i)=='1'){
                    num += s.charAt(i);
                }else{
                    zeroCount++;
                }
            }
            
            s = Integer.toBinaryString(num.length()).toString();

            count++;
        }

        answer[0] = count;
        answer[1] = zeroCount;

        return answer;
    }
}
  • Integer.toBinaryString()을 사용한 방식 (승훈's)

 

※ 2진법은 제공해주는 함수가 있지만 그럼 3진법은...?