본문 바로가기
개발/알고리즘

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

by ISA(류) 2021. 9. 29.

# 문제 원문

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

  1. x의 모든 0을 제거합니다.
  2. 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]

# 문제 풀이

 

s가 1이 될때까지 반복하면서 0을 제거하고 몇번 반복했고, 몇번 0을 제거한지 카운팅해서 반환하는 간단한 문제이다.

레벨1로 분류 되어야할 문제인거 같다. 아니면 그만큼 내가 익숙해진건가? 함정이 있나해서 조금 고민해봤지만 그럴만한 요소가 딱히 없더라. 0을 제거할때 정규식을 이용해서 직접 제거하는 방법도 있지만 굳이 그런 연산을 처리 할 필요성이 없어서 한번 순회하면서 0과 0이 아닌 갯수만 연산했다. 애초에 다음 s는 1의 갯수의 2진수이다.

 

# 솔루션 플로우

1. 입력 받은 s가 1이 될때까지 반복한다.

2. s를 순회하면서 0의 갯수를 구하고 구해진 0의 갯수를 제거된 0의 갯수로 넣는다.

3. s의 length에서 0의 갯수를 제하고 2진수 문자열로 변환한다. 또 반복 횟수를 1증가시킨다.

4. 위의 과정이 끝난후 얻어진 result를 반환한다.

1. 반복문을 활용한 풀이

function solution(s) {
    const result = [0, 0];

    while (s !== "1") {
        let count = 0;
        Array.from(s)
            .forEach((num) => num === "0" && count++);
        s = (s.length - count).toString(2);
        result[1] += count;
        result[0]++;
    }

    return result;
}
반응형