Posts 이진 변환 반복하기 [Python]
Post
Cancel

이진 변환 반복하기 [Python]

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

문제 설명

  • 0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
    • x의 모든 0을 제거합니다.
    • x의 길이를 c라고 하면, x를 c를 2진법으로 표현한 문자열로 바꿉니다.
    • 예를 들어, x = “0111010”이라면, x에 이진 변환을 가하면 x = “0111010” -> “1111” -> “100” 이 됩니다.
  • 0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 1이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.

제한 사항

  • s의 길이는 1 이상 150,000 이하입니다.
  • s에는 ‘1’이 최소 하나 이상 포함되어 있습니다.

문제 설명

  • 위에서 설명하는 내용을 그대로 코드로 옴긴것
  • count(‘0’)을 사용하여 0의 갯수를 zeros에 넣고 replace로 0을 없애줌
  • 이후 새로 만든 new_s의 길이를 format에 넣어 새로운 s를 만들어고 answer에 +1을 시킴
  • s의 길이가 1이 될때까지 while문 반복
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def solution(s):
    zeros = 0
    answer = 0 
    while True:

        zeros += s.count('0')
        new_s = s.replace('0', '')
        len_new_s = len(new_s)
        s = format(len_new_s, 'b')
        answer +=1
        if len(s) == 1:
            break
            
    return [answer, zeros]
1
2
s = '110010101001'
solution(s)
1
[3, 8]
1
2
s = '01110'
solution(s)
1
[3, 3]
1
2
s = '1111111'
solution(s)
1
[4, 1]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 더 간략하게 만듬
# 어차피 1의 갯수로 가지고 하기때문에 0을 replace할 필요가없음.
# if len(s) == 1: break는 while문의 조건으로 걸어서 더 간략히 함

def solution(s):
    zeros = 0
    answer = 0 
    while len(s) != 1:

        zeros += len(s) - s.count('1')
        len_new = s.count('1')
        s = format(len_new, 'b')
        answer +=1
 
    return [answer, zeros]
1
2
s = '110010101001'
solution(s)
1
[3, 8]
1
2
s = '01110'
solution(s)
1
[3, 3]
1
2
s = '1111111'
solution(s)
1
[4, 1]
1
This post is licensed under CC BY 4.0 by the author.