DM Log

[월간 코드 첼린지 시즌1] 이진 변환 반복하기 - Python / JavaScript 본문

알고리즘/프로그래머스

[월간 코드 첼린지 시즌1] 이진 변환 반복하기 - Python / JavaScript

Dev. Dong 2025. 2. 8. 12:22

문제 링크 - https://school.programmers.co.kr/learn/courses/30/lessons/70129

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

[문제 간단 요약]

1. 1과 0으로 이루어진 문자열에서 0을 제거한 길이를 이진수로 변경는 과정을 반복하여 문자열이 "1"이 될 때까지 제거된 "0"과 반복 횟수를 구하는 문제

[문제 해결 방안]

1. 문자열에서 '0'을 제외한 길이 구하기

2. 제외된 0의 갯수 체크

3. 길이를 2진수 만들기

4. 반복

 

[문제 해결 코드 - Python]

def solution(s):
    answer = [0, 0]
    while True:
        if s == '1':
            break
        check_word = ''
        answer[0] = answer[0] + 1
        for i in s:
            if i == '1':
                check_word+=i
            else:
                answer[1] = answer[1] + 1
        check_word_len = len(check_word)
        binary_num = ''
        while True:
            binary_num += str(check_word_len % 2)
            check_word_len = check_word_len // 2
            if check_word_len in [0,1]:
                if check_word_len == 1:
                    binary_num += str(check_word_len)
                break
        s = str(binary_num[::-1])
    return answer

 

[코드 개선]

- '0'을 제외하는 문자열 로직 필요x  s.count('1')을 통해 '1'로만 구성된 문자열의 길이를 파악

- 제외된 '0'의 갯수는 전체 s의 길이에서 s.count('1')를 제외

- 2진수 구하는 내장함수 bin을 사용

def solution(s):
    a, b = 0, 0
    while s != '1':
        a += 1
        num = s.count('1')
        b += len(s) - num
        s = bin(num)[2:]
    return [a, b]

 

[문제 해결 코드 - JavaScript]

function solution(s) {
    var answer = [0, 0];
    while (s !== '1') {
        answer[0] += 1
        const word = s.split('')
        const s_cnt1 = word.filter((el) => (el==='1')).length
        const s_cnt0 = word.filter((el) => (el==='0')).length
        answer[1] += s_cnt0
        s = s_cnt1.toString(2)
    }
    return answer;
}