[Node.js_4기] 코드카타 : 이진 변환 반복하기 (24/02/22)

2024. 2. 22. 19:12공부/코테준비

목차

 

1. 문제

2. 시도

3. 결과

4. 배운점

 

1. 문제 

 

https://school.programmers.co.kr/learn/courses/30/lessons/70129

 

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

 

2. 시도 

 

function solution(s) {
    let answer = [0,0];
    while(s.length > 1) { 
       answer[0] ++ 
       let str = 0;
       let ans = s.split("").filter(x => {
            if(x == 0) {
                answer[1] ++
            } else {
                str++; 
            }
        }); 
        s = str.toString(2); 
    }
    return answer
}

 

answer = [0,0]으로 선언하여 미리 출력 형태를 맞춰두었다.

문제에서 입력된 문자열 s가 "1"이 될 때까지 반복하므로 while문을 사용해 반복문을 돌린다.

 

1. x의 모든 0을 제거합니다

s.split()의 결과값은 s를 구성하는 문자 하나하나를 떼어놓은 배열이며, 이 배열에 filter를 적용한다.

이때, 값이 0이라면 answer[1]을 1을 더하여 제거된 0의 갯수를 세어준다.

0이 아니라면 2번 로직을 실행하기 위해 길이가 필요하므로 길이(str)를 1 늘려준다.

2.  x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.

filter를 돌린 후에, 입력값 s를 str을 2진법으로 표현한 문자열로 교체한다.

thing.toString()은 기본적으로 문자 이외의 값을 문자열로 바꿔주는 함수지만, ()안에 숫자를 넣어 10진수의 진법 변환으로 사용할수도 있다. (parseInt(num, "n")도 같은 기능을 가진다.)

테스트 1
입력값 "110010101001"
기댓값 [3, 8]
실행 결과 테스트를 통과하였습니다.
테스트 2
입력값 "01110"
기댓값 [3, 3]
실행 결과 테스트를 통과하였습니다.
테스트 3
입력값 "1111111"
기댓값 [4, 1]
실행 결과 테스트를 통과하였습니다.

 

3. 결과 

 

테스트 1 통과 (0.08ms, 33.4MB)
테스트 2 통과 (24.26ms, 37.1MB)
테스트 3 통과 (0.07ms, 33.4MB)
테스트 4 통과 (0.06ms, 33.4MB)
테스트 5 통과 (0.07ms, 33.4MB)
테스트 6 통과 (0.12ms, 33.5MB)
테스트 7 통과 (0.18ms, 33.4MB)
테스트 8 통과 (0.15ms, 33.4MB)
테스트 9 통과 (23.92ms, 36.3MB)
테스트 10 통과 (5.44ms, 36.9MB)
테스트 11 통과 (24.68ms, 36.8MB)

filter, toString을 사용하면 쉽게 풀 수 있는 문제였다.

 

4. 배운점 

 

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;
}

filter대신 정규표현식을 사용하여 0의 갯수를 찾아내는 방법도 있었다.