문제

[프로그래머스] 이진변환 반복하기 (LV. 2)

요약

  • 0과 1로 이루어진 문자열이 주어진다.
  • x의 모든 0을 제거하고, x의 길이 c에 대해, x를 “c를 2진법으로 표현한 문자열”로 바꾼다. 이를 “이진 변환”이라고 하자.
  • s가 1이 될 때까지 계속 “이진 변환”을 반복했을 때, 이진 변환의 횟수와, 제거된 모든 0의 개수를 각각 배열에 담아 리턴.


분류

  • 문자열 : 진법 바꾸기

풀이

1. 내 풀이

  • 그냥 스탠다드한 방법이다. 진법 변환에 while 을 사용했다. 따로 빼서 함수로 만들어주었다.
  • divmod() 함수를 사용하면 코드가 더 간결해진다.


def convertNum(num):
    num = int(num)
    arr = []
    while True:
        if num // 2 == 0:
            arr.append(num)
            break
        arr.append(num % 2)
        num //= 2
    return ''.join(map(str, arr[::-1]))


def solution(s):
    times = 0; num_0 = 0
    while int(s) != 1:
        times += 1
        l = len(s)
        s = s.replace('0', '')
        num_0 += l - len(s)

        s = convertNum(len(s))

    return [times, num_0]

2. 최적화 풀이

  • <취업과 이직을 위한 프로그래머스 코딩테스트 문제 풀이 전략> 을 참고한 코드입니다. (링크)
  • bin() 함수를 기억하자. (10진수 -> 2진수)
  • 추가로 알아둘 함수들
  • from to 함수
    n진수 10진수 int(string, n)
    10진수 2진수 bin()
    10진수 8진수 oct()
    10진수 16진수 hex()

    => bin(), oct(), hex() 함수의 반환값은 문자열이다.


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