본문 바로가기
Coding Test

231219 이진 변환 반복하기 - Level 2

by mmm- 2023. 12. 19.

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명

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 함수를 완성해주세요.

 

제한사항

  • s의 길이는 1 이상 150,000 이하입니다.
  • s에는 '1'이 최소 하나 이상 포함되어 있습니다.

 

입출력 예

 

입출력 예 설명

입출력 예 #1

  • "110010101001"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.

  • 3번의 이진 변환을 하는 동안 8개의 0을 제거했으므로, [3,8]을 return 해야 합니다.

입출력 예 #2

  • "01110"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.

  • 3번의 이진 변환을 하는 동안 3개의 0을 제거했으므로, [3,3]을 return 해야 합니다.

입출력 예 #3

  • "1111111"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.

  • 4번의 이진 변환을 하는 동안 1개의 0을 제거했으므로, [4,1]을 return 해야 합니다.

 


코드

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        int count = 0, round = 0, len = 0;
        String binary = "";
            
        while(true) {
            binary = "";
            if(s.equals("0") || s.equals("1"))
                break;
            
            for(int i=0; i<s.length(); i++) {
                if(s.charAt(i) == '0') 
                    count++;
                else
                   binary += String.valueOf(s.charAt(i)); 
            }
            len = binary.length();
            s = String.valueOf(Integer.toBinaryString(len));
            round++;
        }
        
        answer[0] = round;
        answer[1] = count;
        
        return answer;
    }
}

 

풀이

s를 더이상 2로 나누어 값이 달라질 수 없게 되면 반복문을 멈추고, 그렇지 않은 경우에는 계속 반복문을 돈다.

while문 안에서 for문을 돌려 s에 문자들을 하나씩 얻어 s에 존재하는 0의 개수를 찾고, 1의 값만 남게끔 1의 경우에만 문자열 binary에 추가해준다.

반복문이 끝나면 s에서 0을 제거한 문자열이 나오는데, 문제에서 말했듯이 이의 길이를 구해 toBinaryString()을 통해 이진수로 변환한다. 이 과정에 끝나면 이진변환을 하는 과정을 한 번 한 것이기 때문에 round를 1만큼 증가시켜준다. 그리고 다시 while문 처음으로 돌아가면 binary에는 또 다른 새로운 문자열을 넣어주어 그 길이를 구해줘야 하기 때문에 초기화해줘야 한다. 이렇게 while문이 종료되면, answer의 0번째 자리에는 round를, 1번째 자리에는 count를 넣어줘 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;  
    }
}

s가 1이될 때까지 반복문을 돌린다. 제거된 0의 개수를 리턴해야 하는 answer[1]에 s의 길이를 더해준 후, s에 존재하는 00을 공백으로 대체해준다. 그리고 s의 길이를 이진수로 변환한다. 이 과정이 끝나면 이진 변환을 하는 한 번의 과정이 끝난 것이기 때문에 answer[0]을 1만큼 증가시켜준다. 그리고 앞에서 0과 1이 같이 있는 s의 길이를 더해줬던 answer[1]에서 1만 존재하는 문자열 s의 길이(temp)를 감소시켜준다.

 

'Coding Test' 카테고리의 다른 글

231221 괄호 회전하기 - Level 2  (0) 2023.12.21
231214 바탕화면 정리 - Level 1  (0) 2023.12.14
231212 폰켓몬 - Level 1  (0) 2023.12.12
231209 완주하지 못한 선수 - Level 1  (0) 2023.12.09
231130 문자열 나누기 - Level 1  (0) 2023.11.30