이진 변환 반복하기

Mudi·2023년 1월 26일
0

[JavaScript] Coding Test

목록 보기
19/23
post-thumbnail

이진 변환 반복하기

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


문제

0과 1로 이루어진 문자열 s가 1이 될 때까지 주어진 규칙으로 이진법 변환을 계속 하였을 때, 변환 횟수와 제거된 0의 개수를 배열에 담아 반환하세요.

주어진 이진법 변환 규칙
문자열 x에 있는 0을 모두 제거한 후 x의 길이를 2진법으로 표현한 문자열로 바꾸세요.


제한

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

접근

  1. filter로 문자열 s를 1만 남도록 만들어줍니다.
  2. 본래 s길이 - 1만 남겨진 문자열의 길이를 0제거 개수에 더해줍니다.
  3. 1만 남겨진 문자열의 길이를 이진수로 변환한 값을 다시 s에 담아줍니다.
  4. 이 과정을 횟수를 카운트하며 while문으로 s가 1이 될 때까지 반복해줍니다.

풀이

while문

while(s !== "1"){

s가 1이 될 때까지 변환이 반복되어야하므로 while문안에서 코드를 작성해줍니다.


filter로 0 제거하기

let sArr = s.split("");
let filtered = sArr.filter((x) => x !== "0").length;

문자열 s를 배열로 만들어 준 뒤,
filter를 사용하여 0이 제거된 배열의 길이를 filtered 변수에 담아주었습니다.


변환 횟수와 제거된 0의 개수 세기

answer[0]++;
answer[1] += s.length - filtered;

배열 형태로 선언된 answer의 첫번째 아이템에는 변환 횟수를,
두번째 아이템에는 본래 s의 길이에서 필터링된 배열의 길이를 빼준값을 더해줍니다.


이진변환 해주기

s = filtered.toString(2);

규칙대로 filtered의 길이를 toString을 사용하여 2진수로 변환해줍니다.


나의 코드

function solution(s) {
    let answer = [0, 0];
    while(s !== "1"){
        let sArr = s.split("");
        let filtered = sArr.filter((x) => x !== "0").length;
        answer[0]++;
        answer[1] += s.length - filtered;
        s = filtered.toString(2);
    }
    return answer;
}

0개의 댓글