본문 바로가기
기초다지기/JS 코딩테스트

javascript 문자열 s가 1이 될때까지 이진변환 반복하기

by 김빵그 2023. 10. 31.

문제

0과 1로 이루어진 어떤 무자열 x에 대한 이진 변환을 계속 실행한다 x의 모든 0을 제거하고 제거한 길이 값을 2진법으로 계속 표시해 1이 될 때까지 계속 변환할 때 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 배열에 담아 리턴하여라 

나의 풀이 

function solution(s) {
    var count = 0; 
    var removedZeros = 0;
    while (s !== "1") {
         var ones = s.split("").filter((i)=> i !== '0');
         removedZeros += s.length - ones.length;
         s = ones.length.toString(2);
         count++;
       
    }
    return [count, removedZeros];
}
  • count와 removeZeros 변수는 변환 횟수와 제거된 0의 개수를 추적하는데 사용된다
  • while 루프를 사용하여 주어진 문자열이 "1"이 아닌 동안 계속 반복된다
    • ones 변수는 주어진 문자열 s에서 "0"을 제외한 문자들만으로 이루어진 배열을 나타낸다 
    • removedZeros 제거된 0의 개수를 누적
    • s는 현재 길이를 2진수로 나타낸 문자열로 업데이트 한다
    • while 루프가 "1"이 되면 반복이 종료되고 [count, removedZeros] 배열이 반환된다

다른 풀이

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;
}
  • answer [0,0] 로 초기화 
  • s의 길이가 1보다 큰 동안 반복한다 
    • s.match(/0/g)를 사용해 s에서 0을 모두 찾는다. 0이 없는 경우에도 빈 배열을 반환하도록 한다 
    • replace를 이용해 0을 모두 제거한후 문자열의 길이를 2진수로 나타낸 문자열로 업데이트 한다
function solution(s) {
    var answer = [];
    let deleted = 0
    let count =0
    while(s !== '1'){
        count++
        let zero  =0 
        for(let i = 0 ; i <s.length ; i++){
            if(s[i] === '0') zero++
        }
        deleted += zero
        s = (s.length-zero).toString(2)       
    }
    return [count,deleted];
}