프로그래머스 70129 이진 변환 반복하기

Cloud_ Ghost·2024년 6월 28일

Python

목록 보기
14/15

이진 변환 반복하기

문제 설명

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'이 최소 하나 이상 포함되어 있습니다.

입출력 예

입출력 예 설명

입출력 예 #1

"110010101001"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.

3번의 이진 변환을 하는 동안 8개의 0을 제거했으므로, [3,8]을 return 해야 합니다.

입출력 예 #2

"01110"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.

3번의 이진 변환을 하는 동안 3개의 0을 제거했으므로, [3,3]을 return 해야 합니다.

입출력 예 #3

"1111111"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.

4번의 이진 변환을 하는 동안 1개의 0을 제거했으므로, [4,1]을 return 해야 합니다.

풀이

def solution(s):
    count = 0
    zero_count = 0
    
    while s != "1": # s가 1이 될 때 까지 반복문 진행한다.
        zero_count += s.count('0')
        s = s.replace('0', '') # 0을 공백으로 변환해서 0 제거
        s = bin(len(s))[2:] # bib함수 : 2진수로 변환, 0b가 붙으니까 그거 제거하려고 슬라이싱 사용
        count += 1
    
    return [count, zero_count]

먼저 반복문의 조건을 != 1을 줘서 s가 1이 아닌 경우 계속해서 반복문이 돌아가도록 만듭니다.
(문제의 조건에서 s=1일 때 출력을 하기 때문에!)

그러고 나서 일단 zero_count라는 변수를 만들고 주어진 s에 존재하는 0의 개수를 count함수를 사용해서 세고 난 뒤 0의 개수를 zero_count에 담아줍니다.
이후 s에 존재하는 0을 공백으로 replace함수를 사용해서 만들어버립니다.(즉, 0을 제거합니다.)

이 다음 bin함수가 사용되는데 이 함수의 경우 사용하고나면 0bxxxx... 이런식으로 결과가 나오기 때문에 슬라이싱을 사용해서 0과 1은 인덱스에서 나오지 않도록 하고 (0과1이 0b입니다.) 2부터 출력이 되도록 만들어 줍니다.

그러고 난 뒤 count값을 1씩 증가하고
return에서 count와 zero_count를 출력하면 결과에서 정답을 찾을 수 있습니다.

profile
행복합시다~

0개의 댓글