본문 바로가기

코딩 테스트

[프로그래머스] (Lv.2) 이진 변환 반복하기

728x90

문제


0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

 

  1. x의 모든 0을 제거합니다.
  2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.

예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.

0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

 

-  출력 예시  -

정답 코드


<  내 정답 코드 1  >

class Solution {
    static int zeros = 0;
    static int count = 0;
    
    public int[] solution(String s) {
        makeBinaryNum(s);
        int[] answer = {count, zeros};

        return answer;
    }

    public static String makeBinaryNum(String s) {
        count++;

        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '0') {
                zeros++;
            }
        }
        s = s.replace("0", "");
        int length = s.length();
        s = Integer.toBinaryString(length);

        if (s.equals("1")) {
            return s;
        }
        return makeBinaryNum(s);
    }
}

 

<  내 정답 코드 2  >

class Solution {
    public int[] solution(String s) {
        int zeros = 0;
        int count = 0;

        while (!s.equals("1")) {
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == '0') {
                    zeros++;
                }
            }
            s = s.replace("0", "");
            s = Integer.toBinaryString(s.length());
            count++;
        }

        int[] answer = {count, zeros};

        return answer;
    }
}

 

<  타인 답변 코드  >

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        int temp;
        while (!s.equals("1")) {
            answer[1] += s.length();
            s = s.replaceAll("0", "");
            temp = s.length();
            s = Integer.toBinaryString(temp);
            //System.out.println("s : " + s ); 
            answer[0]++;
            answer[1] -= temp;
        }
        return answer;
    }
}

이것을 주의하자!


-  나는 두 가지 방식으로 풀었다.

 

   (1)  static 변수  +  재귀함수

         :  동일한 작업을 반복해서 진행하기 위해 재귀함수를 만들었고, 몇 개의 0 을 삭제했는지, 몇 번 반복했는지를 

            파악하기 위해서 static 변수로 만들었다.

 

   (2)  while

        :  while 문을 사용해서 원하는 조건까지 무한 반복하도록 만들었다. 사실 처음에는 재귀함수만 떠올랐는데

           생각해보니 while 문으로도 구현이 가능한 것 같아서 성공적으로 만들었다. 

 

-  들어온 String 변수에서 0 이 몇 개인지 센 다음, replace( ) 메서드를 통해 0 을 일괄적으로 없앴다. 그리고 만들어진 문자열의 길이를 구해 Integer.toBinaryString( ) 를 사용하여 이진수로 바꿨다. 동일하게 s 변수에 저장해서 "1" 이 될때까지 반복했다.

 

-  타인 답변 코드에서는 0 을 삭제하는 로직이 나와 다르다. 나는 for 문을 이용해서 하나씩 탐색했다면, 해당 코드에선 먼저 모든 자리수를 구한 후 0 을 삭제한 뒤의 남은 수를 빼서, 총 삭제된 0 의 개수를 구했다. 이 방법이 더 효율적인 것 같다.