본문 바로가기
JAVASCRIPT/코딩테스트

[자바스크립트]프로그래머스 레벨 2 - 이진 변환 반복하기

by 진짠 2023. 2. 27.
728x90
문제

0과 1로 이루어진 문자열 x에 대해 이진 변환을 정의한다.

 

1. x의 모든 0은 제거

2. x의 길이를 2진법으로 표현한 문자열로 바꿈

 

1과 2번을 계속 반복하여 제거된 모든 0의 개수를 배열에 담아 return 하는 문제이다.

 

문자열의 문자들을 비교하여 0일 경우 제로 카운트를 더해주고 1일 경우 원 카운트를 더해주는 방식으로 가닥을 잡았다. 이진법으로 바꾼 문자열을 비교하는 데에는 filter함수를 사용하기로 생각했다.

 

이 과정을 while문을 사용해 반복해주면 제로 카운트와 원 카운트의 합을 구할 수 있을 것이고 그것을 배열로 담으면 될 것이다.

 

제한사항

s의 길이는 1 이상 150,000 이하.

s에는 '1'이 무조건 한개 이상 포함.

 

신경써서 코딩하는 부분은 없었다. 이진 변환을 반복했을 때 마지막은 항상 '1'로 끝나야 한다는 점을 유의해야 한다.

 

function solution(val) {
    let zerocount = 0;
    let count = 0;
    while(val.length > 1) { //이진변환해서 1이 될때까지 반복 수행
       count++; //반복한 횟수
       let div = 0;
       let answer = val.split("").filter(x => {
            if(x == 0) {
                zerocount++; //0일 경우 제로 카운트 증가
            } else {
                div++; //1일 경우 div를 더해준다. 이것을 다시 이진변환 시키기 위해서
            }
        }); 
        val = div.toString(2); //이진법으로 변환
    }

    return [count,zerocount];
}

while문을 사용하여 val의 길이가 1보다 클 때 까지 반복해서 수행하도록 한다. val이 1일 경우에만 val의 길이가 1과 같아지기 때문에 거기에 맞게 반복문을 멈춰주기 위한 조건이다.

 

div는 이진변환을 반복하기 위해 1일 경우 카운트를 증가시켜 주려고 만든 변수이고 zerocount는 총 0개수를 세기 위해 만든 변수이다.

 

그리고 이 문제를 풀면서 toString()으로 이진법을 변환할 수 있다는 사실을 처음알았다.

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/toString

 

Number.prototype.toString() - JavaScript | MDN

toString() 메서드는 특정한 Number 객체를 나타내는 문자열을 반환합니다.

developer.mozilla.org

보통 내가 자주 쓰는 문법은 "숫자".toString() 형태로 숫자 형태를 String 형태로 변환하는데 사용했다. 하지만 "숫자".toString(2)를 사용하면 숫자를 이진법으로 변환할 수 있다.

 

이진법 뿐만 아니라 8,16을 넣으면 다른 진법으로도 사용할 수 있다.

 

이 toString을 사용해서 0이 아닌(그러니까 1인) 문자의 개수를 세서 그 수를 이진법으로 바꿔준다.

 

이 로직을 계속 반복하면 총 0의 개수와 반복한 횟수를 구할 수 있다.

 

다른 사람 풀이

0의 개수를 구할 때 정규식을 사용하는 방법도 있다는 것을 알았다.

 

(div.match(/0/g||[])).length

형태를 사용하여 0의 개수를 구한다음 replace로 0을 지우는 방식을 반복하면 좀 더 간결하게 구현할 수 있다.

 

('/0/g' 부분이 0을 구분하는 부분, '||[]' 부분은 0이 없을 경우  null을 반환해서 length를 사용할 수 없기 때문에 그것을 방지하기 위함.)

 

정규식은 외계 문자 같아서 공부하기가 쉽지 않은데 이곳 저곳에서 생각보다 유용하게 써먹을 때가 많아서 기본 적인 문법 정도는 알아두는게 좋을 것 같다는 생각이 들었다.

 

 

728x90

댓글