포스트

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

Python으로 0 제거 횟수와 이진 변환 횟수를 계산하고, bin()을 활용한 더 간단한 풀이까지 정리한 글입니다.

For the English version of this post, see here.
[Python] 프로그래머스 - 이진 변환 반복하기

Programmers 이진 변환 반복하기

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def solution(s):
    answer = []
    z_cnt = 0
    cnt = 0
    
    while True:
        
        if len(s) == 1 and s[0] == '1':
            break
        
        z_cnt += s.count('0')
        s = s.replace("0", "")
        num = len(s)
        
        arr = []
        while num != 0:
            arr.append(str(num%2))
            num = num//2
        
        arr.reverse()
        s = ''.join(arr)
        cnt += 1
    
    answer.append(cnt)
    answer.append(z_cnt)
    
    
    return answer
  • 처음에는 while 문 안에 이진 변환하는 부분의 while 문을 while num//2 != 0: 이렇게 작성하였는데, 그렇게 되면 마지막에 1만 남을 때 1이 포함되지 못하고 조건에 걸려서 반복문이 종료됨
    • 따라서 num != 0으로 조건을 바꿈
  • 또한, 처음에는 역정렬 할 때 arr.sort(reverse=True)로 작성하였는데, 그렇게 작성하면 그냥 큰 수부터 정렬이기 때문에 순서가 망가짐
    • 따라서 arr.reverse()를 통해 나머지가 거꾸로 쌓이도록 해줌
  • 처음에는 만든 arr을 s에 대입하기 위해 s = arr을 사용해서 문자열이 아니라 리스트가 되도록 했기 때문에 오류가 생겼었음
    • 해결하기 위해 s = '',join(arr)을 통해서 문자열로 저장할 수 있도록 함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def solution(s):

    z_cnt = 0

    cnt = 0

    

    while s != "1":

        z_cnt += s.count("0")

        s = s.replace("0", "")

        

        num = len(s)

        s = bin(num)[2:]

        

        cnt += 1

    

    return [cnt, z_cnt]

위와 같은 방식으로도 작성 가능함

  • bin() 함수
    • 숫자를 2진수(binary) 형태의 문자열로 바꿔주는 파이썬 함수ex) bin(10) -> '0b1010'으로 바꿔줌 (앞의 0b는 2진수라는 표시)

    • 위 코드에서는 이진수 부분만 필요하기 때문에 bin(10)[2:]처럼 2진수라고 나타내주는 부분을 잘라냄