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

최지나·2023년 10월 25일
2

코딩테스트

목록 보기
55/154

문제

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'이 최소 하나 이상 포함되어 있습니다.

입출력 예

sresult
"110010101001"[3,8]
"01110"[3,3]
"1111111"[4,1]

문제 출처

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

생각

  • string이 1이 될 때까지 반복해야 하니 while문을 사용하자
  • 2진법으로의 변환은 Integer.toString(숫자, 진법)을 사용하자
  • 매 반복문마다
    • 0의 개수를 cnt한 뒤 제거하고
    • 반복문의 횟수마다 변환 cnt를 늘리자

코드

class Solution {
    public int[] solution(String s) {

        int changeCnt = 0;
        int removeCnt = 0;
        
        while (!s.equals("1")){
            for (String str: s.split("")){
                if (str.equals("0")) removeCnt++;
                s = s.replaceAll("0", "");
            }
            s = String.valueOf(Integer.toString(s.length(), 2));
            changeCnt++;
        }
        int[] answer = {changeCnt, removeCnt};
        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;  
    }
}
  • 10진법 String을 2진법 String으로 변환해주는 .toBinaryString()을 활용한 풀이었다
  • 또한, for문을 돌며 제거한 0의 개수를 세는 것이 아니라, replace 전후의 String의 길이를 비교해 0의 개수를 측정한 점이 속도 측면에서 좋다고 생각했다 😉😉
profile
의견 나누는 것을 좋아합니다 ლ(・ヮ・ლ)

0개의 댓글