0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
s result
"110010101001" [3,8]
"01110" [3,3]
"1111111" [4,1]
입출력 예 #1
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 "110010101001" 6 6 "110"
2 "110" 1 2 "10"
3 "10" 1 1 "1"
입출력 예 #2
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 "01110" 2 3 "11"
2 "11" 0 2 "10"
3 "10" 1 1 "1"
입출력 예 #3
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 "1111111" 0 7 "111"
2 "111" 0 3 "11"
3 "11" 0 2 "10"
4 "10" 1 1 "1"
문제에서 주어진대로 구현을 하면 된다. 우선 while문을 통해 s를 변화시키면서 매 반복마다 변환 횟수를 1씩 증가시켜주고 s에 존재하는 1의 갯수를 따로 저장한 뒤에, 없앤 0의 갯수를 s의 길이-1의 갯수만큼 증가시킨다. s를 1*(1의 갯수)로 갱신하고 다시 s를 이진수로 나타낸뒤에 앞에 붙은 b0을 제거하기 위해 슬라이싱을 사용해 [2:]만큼만 s에 저장하도록 한다. 이 과정을 반복하다가 s가 1이 되면 반복을 멈춘다.
파이썬 내장함수 중에 bin()을 사용하면 인자로 들어간 수를 이진법으로 표현해준다. 물론 문자열로 표현한다. 만약 bin(4)를 출력하면 b0100과 같은 형식으로 출력된다. 앞에 b0이 붙어 이진법임을 표시하는 것이다. 이 문제에서 bin()함수를 사용하기 위해서는 앞에 붙은 b0을 제거하고 사용해야 하므로 문자열 슬라이싱을 사용해야 한다.
s의 길이 - one
을 더해준다.def solution(s):
answer = []
b_cnt=0
z_cnt=0
while s!='1':
b_cnt+=1
one=s.count('1')
z_cnt+=len(s)-one
s='1'*one
s=bin(len(s))[2:]
answer.append(b_cnt)
answer.append(z_cnt)
return answer