본문 바로가기
[프로그래머스]

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

by 쥰5017 2022. 9. 8.

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

 

0과 1로 이루어진 문자열에 대해 다음과 같은 변환 과정을 거친다.

  1. x의 모든 0을 제거한다.
  2. x를 "x의 길이를 2진법으로 표현한 문자열"로 바꾼다.

예시) x='110010101001'

 1) 0을 제거 > x='111111'

 2) x의 길이를 2진수로 표현 > x의 길이가 6이므로 2진수로 바꾸면 '110' > x='110'

 

위의 과정을 x가 1이 될 때까지 반복한다. 2진 변환 과정을 거친 횟수와 제거한 0의 개수를 배열로 출력한다.

입출력▽

s result
'110010101001' [3, 8]

 

 

1) 우선 s의 1과 0을 구분하여 1은 저장하고, 0은 개수를 센다. 

 

var answer = [0, 0];
let one = '';
for (let i = 0; i < s.length; i++) {
    (s[i] == 1) ? one += '1' : answer[1]++; 
}

 

s의 1을 따로 저장할 one 변수를 선언해 주었다. 최종 결과물을 배열로 출력해야 하므로 배열에 0의 개수(배열 index 1 자리)를 카운트업 한다.

 

 

2) 1을 저장한 one의 길이를 재어 2진수로 변환하고 다시 s에 할당해 준다. 이때 2진 변환 횟수(배열 index 0 자리)를 카운트업 한다.

 

s = Number(one.length).toString(2);
answer[0]++;

 

 

3) 위의 과정을 s가 '1'이 될 때까지 무한 반복하기 위해 for문을 조건없이 작성하고 마지막에 조건 break를 걸어둔다.

 

for (;;) {
	//1, 2번 코드 내용 넣을 자리        
    if (s === '1') break;
}

 

 

 

마무리.

function solution(s) {
    var answer = [0, 0];
   
    for (;;) {
        let one = '';
        for (let i = 0; i < s.length; i++) {
            (s[i] == 1) ? one += '1' : answer[1]++; 
        }

        s = Number(one.length).toString(2);
        answer[0]++;
        
        if (s === '1') break;
    }
    
    return answer;
}

댓글