이진수 파티 bin( ) : 이진 변환 반복하기

solee·2022년 9월 19일
0

Python

목록 보기
15/16

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

일단 문제를 파악해 보면,

  1. 0 제거
  2. 제거한 0의 갯수를 더해준다
  3. 결과물의 길이를 이진수로 변환
  4. 반복

이다.
생각보다 금방 풀기도 했지만, 정신없이 풀다 보니 결과가 이렇다.


def solution(s):
    binary_cnt = 0
    zero_cnt   = 0
    
    while s != 1:
        zero_cnt += s.count("0")
        s = s.replace("0", "")
        binary_cnt += 1
        if len(s) == 1:
            return [binary_cnt, zero_cnt]
        s = bin(len(s))[2:]
    
    return [binary_cnt, zero_cnt]

(코드가 못생겼어~~~)


좀 더 가독성 좋게, 또 좀 더 빠르게 만들고 싶어서 손봤다.

def solution(s):
    binary_cnt = 0
    zero_cnt   = 0
    
    while s != "1":
        binary_cnt += 1
        zero_cnt   += s.count("0")
        s = s.replace("0", "")
        s = bin(len(s))[2:]
    
    return [binary_cnt, zero_cnt]

꽤나 깔끔해지긴 했는데, 속도가 아쉽다. 그래서 다른 사람의 풀이를 살피니 머리를 한 대 맞은 것 같은 풀이가 있었다!!!





포인트는, 이진수에서 "0을 제거한 길이" == "1의 갯수" 라는 거다.
0을 count하고 0을 replace할 것이 아니라, 1을 count한 후 s의 길이에서 1의 갯수를 빼면 그것이 제거한 0의 갯수가 되고, 또 1의 갯수가 곧 0을 제거한 길이이므로 그냥 그걸 바로 bin( )으로 이진수로 변환하면 끝난다.

def solution(s):
    binary_cnt = 0
    zero_cnt   = 0
    
    while s != "1":
        tmp = s.count("1")
        binary_cnt += 1
        zero_cnt   += len(s) - tmp
        s = bin(tmp)[2:]
    
    return [binary_cnt, zero_cnt]

와~우
조금 더 논리적으로 생각해야겠다고 다짐했다.

profile
DA DA DA

0개의 댓글