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

seb Incode·2023년 2월 8일
0
post-thumbnail

문제




구현방식

입력 값 제한 사항을 보면, 어떤 문자열이 입력값으로 들어오던지 최소 한 번은 변환 과정을 거치기 때문에 do-while문을 사용했다.

1번 과정 구현

문자열 s를 앞에서부터 하나씩 검사한다. "0"이면 count+1, "1"이면 새로운 문자열 변수에 "1"를 붙여써줘서 마치 기존 문자열에서 0을 제거한 것 처럼 만든다.

이 사이에 변환 횟수 +1 했다.

2번 과정 구현

1만 모아놓은 새로운 문자열의 길이를 구하고, for문을 활용해서 이진법으로 바꾼 문자열을 구한다. 사실 이진수로 변환하려면 2로 계속해서 나눴을 때 생기는 나머지 값들을 거꾸로 써야하지만 나의 경우, reverse하는 과정이 귀찮아서 그냥 나머지값들을 문자열에 냅다 박아놓은 후, 거꾸로 복사했다.

그렇게 구한 이진수를 가지고 1, 2번 과정을 "1"이 될 때까지 반복한다.

반복이 끝났다면 1번 과정에서 구한 0 제거 횟수와, 변환 횟수를 배열에 넣어서 반환한다.

코드

import java.util.*;

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        int zeroCount = 0;              // 제거한 0의 개수
        int changeCount = 0;
        String newStr = "";
        
        do{
            for(int i=0;i<s.length();i++){
                if(s.charAt(i) == '0'){
                    zeroCount++;
                }
                else{
                    newStr += "1";
                }
            }
            String binaryStr = "";
            s = newStr;
            newStr = "";            //초기화

            //이진변환
            int c = s.length();
            while(c!=0){
                binaryStr += (c%2);
                c /= 2;
            }
                
            changeCount++;         //이진변환 횟수 +1
            s = "";
                
            for(int i=binaryStr.length()-1;i>=0;i--){
                s += binaryStr.charAt(i);          //거꾸로 저장된 이진수 변환
            }  
             
        }while(!s.equals("1"));
        
        answer[0] = changeCount;
        answer[1] = zeroCount;
        
        return answer;
    }
}

회고

처음에 변환 횟수가 기댓값보다 -1만큼 나와서 헤맸다. 알고보니 입력값이 "1"이어도 변환 과정은 무조건 한 번은 count된다는 것을 간과한 것이 원인이었다.

0개의 댓글