Level 2 ) 이진 변환 반복하기

Doozuu·2023년 3월 14일
0

프로그래머스 (JS)

목록 보기
90/183

문제 설명

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

제한사항

s의 길이는 1 이상 150,000 이하입니다.
s에는 '1'이 최소 하나 이상 포함되어 있습니다.

입출력 예

s				result
"110010101001"	[3,8]
"01110"			[3,3]
"1111111"		[4,1]

풀이

  1. 배열의 0번째는 시행 카운트, 1번째는 0의 갯수 누적합을 담아준다.
  2. 정규표현식을 이용해 0의 개수를 센다.
  3. s의 문자열 길이에서 0의 갯수를 빼 이진법으로 변환한다.
  4. s의 길이가 1이 되기 전까지 반복한다.
    (s에는 1이 최소 하나 이상 포함되어 있으므로 길이가 1이 되면 1만 남음.)
function solution(s) {
    let answer = [0,0];
    while(s.length > 1){
        let len = s.replace(/[^0]/g,'').length;
        answer[0]++;
        answer[1] += len;
        s = (s.length - len).toString(2);
    }
    return answer;
}

이진법 변환 주의 : 숫자에 바로 toString() 붙이면 안됨.

// x
100.toString(2)
// o
let num = 100;
num.toString(2)

다른 풀이

match를 이용해 0의 갯수 세기
(match되는게 없는 경우 length를 세면 null이 뜨므로 || [] 꼭 해주기)

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;
}
profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글