문제
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의 원하는 결과값을 처리해주어 재귀함수를 처리한다.
['1','','2','3','','4'].join()
['1','','2','3','','4'].join('')
두 차이는 크다.
첫번째는"1,,2,3,,4"
로 join하였을때 ,를 같이 추가되는 형태이나
두번째는"1,2,3,4"
로 join하였을때 ,가 따로 추가되지 않는 형태이다.