본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)/코딩 테스트 & 알고리즘

이진 변환 반복하기 (프로그래머스, Level 2)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2022. 6. 21.

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

  • x의 모든 0을 제거합니다.
  • 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'이 최소 하나 이상 포함되어 있습니다.

입출력 예

주어진 데이터 결과 설명
"110010101001" [3,8] 3번 반복하였고 0은 8개 제거 되었습니다.
"01110" [3,3] 3번 반복하였고 0은 3개 제거 되었습니다.
"1111111" [4,1] 4번 반복하였고 0은 1개 제거 되었습니다.

 

문제 난이도가 레벨2라고 했지만 체감상 1정도 되는 거 같습니다..^^;

 

문제에 접근하기 위한 단계 입니다.

  1번. 주어진 값에서 0을 제거 합니다.

  2번. 제거한 데이터에서 길이를 구합니다.

  3번. 구한 길이를 다시 2진법으로 변경하여 바꾸어 단계를 반복 합니다.

  4번. 값이 1이면 그만하도록 합니다.

 

주어진 값에서 0을제거하기 위해서 문자열 값을 char 배열로 변환한 뒤에 0인 값과 1인 값을 구분하였습니다.

구분한 값 에서 1인 값만 다시 문자로 만들어 준 다음에 길이를 구하여 주었습니다.

1번2번에 대한 코드 입니다.

public static int[] solution(String s) {
    int[] answer = {0, 0};

    StringBuffer buff = new StringBuffer();
    char[] array = s.toCharArray();
    for(char a : array) {
        if(a != '0') buff.append(a);  //0이 아니면 더해 줍니다.
    }    
    int length = buff.toString().length(); //구한 길이 값 입니다.
    
    return answer;
}

 

구한 길이를 다시 이진법으로 변환하여 새로운 문자를 생성하여 줍니다.

3번에 해당하는 내용을 추가하여 보았습니다.

public static int[] solution(String s) {
    int[] answer = {0, 0};

    StringBuffer buff = new StringBuffer();
    char[] array = s.toCharArray();
    for(char a : array) {
        if(a != '0') buff.append(a);  //0이 아니면 더해 줍니다.
    }    
    int length = buff.toString().length(); //구한 길이 값 입니다.
    s = Integer.toBinaryString(length); // 길이를 다시 이진법으로 바꿔 줍니다. 
    
    return answer;
}

 

이제 남은것은 위 단계를 반복하면서 반복문이 동작한 횟수와 0을 바꾼 횟수를 구하는 것 입니다.

여기서 고민해야 되는 것은 "s의 길이는 1 이상 150,000 이하입니다." 라는 조건 입니다.

그렇기 때문에 StringBuffer 값을 비울 때 길이만큼 비우는 방식을 적용하여 주었습니다.

public static int[] solution(String s) {
    int[] answer = {0, 0};

    StringBuffer buff = new StringBuffer();
    while(!s.equals("1")) {
        char[] array = s.toCharArray();
        for(char a : array) {
            if(a != '0') {
                buff.append(a);
            } else {
                answer[1]++; //0값 이므로 0을 바꾼 횟수를 증가시킵니다.
            }
        }
        answer[0]++;  //반복문이 동작한 횟수를 증가시킵니다.
        s = Integer.toBinaryString(buff.toString().length());  
        buff.delete(0, buff.length());  //바꾼 문자를 보관하는 스트링버퍼를 비워줍니다.
    }
    return answer;
}

 

이제 남은것은 제출하기!

통과입니다!

 

그렇게 어렵지 않은 문제여서 푸는데 오래걸리지 않았던 것 같습니다.

이진법에 대한 작업을 많이하지 않아서 Integer 클래스에서 toBinaryString 메소드 호출하는 방법은 검색하여 적용하였..ㅠ

 

이상으로 이진 변환 반복하기 (프로그래머스, Level 2)에 대해서 살펴보았습니다.

궁금한점 또는 틀린 부분은 언제든 연락주세요!👻

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글