문제 설명
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'이 최소 하나 이상 포함되어 있습니다.
입출력 예
s | result |
"110010101001" | [3,8] |
"01110" | [3,3] |
"1111111" | [4,1] |
코드 및 설명
def solution(s):
zero_count = 0
binary_count = 0
while int(s) > 1:
zero_len = s.count('0')
len_s = len(s)
#s = bin(len('1' * (len_s - zero_len))).split('0b')[1]
s = bin(len_s - zero_len).split('0b')[1]
zero_count += zero_len
binary_count += 1
return [binary_count, zero_count]
여기서 보면 일단 0의 카운트와 이진변환을 몇번 했는 지의 값을 구하는 게 핵심이다. s값이 1이 될때까지 반복해야하기 때문에 while문을 이용하여 작업진행했고, s의 길이와 zero_count를 s.count('0')으로 zero의 갯수를 구한다. 그 후 두 값을 빼주면 1의 갯수를 알 수 있게 되고, 1 * * (len_s - zero_len) 했는 데 지금와서 생각해보니 어차피 길이만 알면 되니까. 저 부분이 필요가 없겠네... s = bin(len_s - zero_len).split('0b')[1] 이렇게 수정하면 될듯... 다시 설명하자면, 길이를 이진수로 다시 바꾸고 방금 위에 작업을 반복하면 1이 결국 나오는 데 그때까지의 zero_count와 binary_count를 return 하면 된다.
'삽집하는 개발들 > 알고리즘' 카테고리의 다른 글
[54일차][Lv2][프로그래머스][12911]다음 큰 숫자 (6) | 2023.09.08 |
---|---|
[53일차][Lv2][프로그래머스][12924]숫자의 표현 (8) | 2023.09.07 |
[52일차][Lv2][프로그래머스][12909]올바른 괄호 (0) | 2023.09.05 |
[51일차][Lv2][프로그래머스][12941]최솟값 만들기 (2) | 2023.09.04 |
[50일차][Lv2][프로그래머스][12951]JadenCase 문자열 만들기 (2) | 2023.09.03 |