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

KHW·2021년 4월 23일
0

알고리즘

목록 보기
21/37

문제
100/100

기본적인 내용

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

성공한 수정 전 코드

function solution(s) {
    var answer = [];
    let trial = 0;
    let eraseZero = 0;
    return (k(s,trial,eraseZero));
    
}

function k (s,trial,eraseZero){
    if(s.split('').map(x=>{
        if(x !== '1' ){
            eraseZero++;
            return ''
        }
        else{
            return '1';
        }
    }).join('') !='1'){
        trial++;
        return k(s.split('').map(x=>x !== '1' ? '' : '1').join('').length.toString(2),trial,eraseZero)
    }
    else{
        trial++;
        return [trial,eraseZero];
    }
}

수정 후 코드

function solution(s) {
    let result = {
        trial : 0,
        eraseZero : 0
    }
    return binaryConversion(s,result);
}

function binaryConversion(s,result){
    result.trial++;
    const conversionSetting = s.split('').map(x=>x !== '1' ? '' : '1').join('').length.toString(2);
    if(isEqualStringOne(s,result))
        return binaryConversion(conversionSetting,result);
    else
        return [result.trial,result.eraseZero];
}

function isEqualStringOne(s,result){
    return s.split('').map(x=>{
        if(x !== '1'){
            result.eraseZero++;
            return ''
        }
        else{
            return '1';
        }
    }).join('') !== '1';   
} 

result의 프로퍼티로 trial과 eraseZero 설정하여 매개변수를 줄인다.
함수를 분리하여 if else문의 가독성을 높인다.
binaryConversion의 매개변수가 너무 길어서 이를 const conversionSetting으로 지정하였다.

해당 값이 '1'이 되는때에 반복을 끝내기때문에 이를 반복하는 재귀함수 역할을 binaryConversion이 해주고
이를 반복하는 상태인 if문의 return으로 재귀함수를 반복시키고 else로 return의 원하는 결과값을 처리해주어 재귀함수를 처리한다.

join문

['1','','2','3','','4'].join()
['1','','2','3','','4'].join('')

두 차이는 크다.
첫번째는 "1,,2,3,,4"로 join하였을때 ,를 같이 추가되는 형태이나
두번째는 "1,2,3,4"로 join하였을때 ,가 따로 추가되지 않는 형태이다.

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자

0개의 댓글