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

박기영·2023년 1월 12일
0

프로그래머스

목록 보기
115/159
post-custom-banner

solution 1

function solution(s) {
    let iter = 0;
    let count = 0;
    
    while(s.length > 1){
        let newS = "";
        
        for(let i = 0; i < s.length; i++){
            if(s[i] === "0"){
                count += 1;
                continue;
            }
            
            newS += s[i];
        }
        
        s = newS.length.toString(2);
        
        iter += 1;
    }
    
    return [iter, count]
}

0이 아닌 값만 남기도록 newS를 만든다.
이 때, 생략되는 0의 개수를 누적합 해준다.

newS의 길이를 2진수로 변환한 것을 새로운 s로 할당한다.
다음 연산을 진행하기 전 반복 횟수를 누적합 해준다.

s의 길이가 1보다 작아지면 1만 남은 것이므로 연산이 종료된다.
반복 횟수와 생략되는 0의 개수를 반환한다.

solution 2

function solution(s) {
    let iter = 0;
    let count = 0;
    
    while(s.length > 1){   
        const newS = [...s].filter((str) => str !== "0");
        
        count += s.length - newS.length;
        
        s = newS.length.toString(2);
        
        iter += 1;
    }
    
    return [iter, count]
}

for문으로 일일이 문자열을 체크해줬던 것을 filter()로 해준 것이다.
물론, 시간 복잡도 면에서는 크게 다른게 없다.
두 방법 모두 반복이 중첩되기 때문이다.

다른 분 풀이

function solution(s) {
    var answer = [0,0];
  
    while(s.length > 1) {
        answer[0]++;
        answer[1] += (s.match(/0/g) || []).length;
        s = s.replace(/0/g, '').length.toString(2);
    }
  
    return answer;
}

정규식을 활용하셨다. 또한 반환할 값을 미리 배열에 넣어놓고 사용하셨다.

/0/g를 활용하여 문자열 전체에 대해서 0 문자열을 찾아 배열화한다.
만약 0이 없으면 null이 반환되므로, 길이를 구할 수 없어
null이 나왔을 경우 빈 배열이 생성되도록 한다.
여기서의 길이가 곧 삭제할 0의 개수가 된다.

그리고 replace()를 통해 0 문자열을 빈 문자열로 변경해준다.
변경된 문자열의 길이를 toString(2)을 통해 2진수로 변환하여 새로운 s로 지정한다.

s의 길이가 1이 될 때까지 이를 반복한다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글