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의 개수를 반환한다.
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이 될 때까지 이를 반복한다.