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
"110010101001"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 | 이진 변환 이전 | 제거할 0의 개수 | 0 제거 후 길이 | 이진 변환 결과 |
---|---|---|---|---|
1 | 110010101001 | 6 | 6 | 110 |
2 | 110 | 1 | 2 | 10 |
3 | 10 | 1 | 1 | 1 |
3번의 이진 변환을 하는 동안 8개의 0을 제거했으므로, [3,8]
을 return 해야 합니다.
입출력 예 #2
01110이 1이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 | 이진 변환 이전 | 제거할 0의 개수 | 0 제거 후 길이 | 이진 변환 결과 |
---|---|---|---|---|
1 | 01110 | 2 | 3 | 11 |
2 | 11 | 0 | 2 | 10 |
3 | 10 | 1 | 1 | 1 |
3번의 이진 변환을 하는 동안 3개의 0을 제거했으므로, [3,3]
을 return 해야 합니다.
입출력 예 #3
1111111이 1이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 | 이진 변환 이전 | 제거할 0의 개수 | 0 제거 후 길이 | 이진 변환 결과 |
---|---|---|---|---|
1 | 1111111 | 0 | 7 | 111 |
2 | 111 | 0 | 3 | 11 |
3 | 11 | 0 | 2 | 10 |
4 | 10 | 1 | 1 | 1 |
4번의 이진 변환을 하는 동안 1개의 0을 제거했으므로, [4,1]
을 return 해야 합니다.
def solution(s):
cnt, cnt_zero = 0,0 # 이진변환(cnt), 0 제거 갯수(cnt_zero)
while True:
if s == '1': # 만약 s가 '1'이라면 break
break
cnt += 1 # 이진변환 카운트 +1
cnt_zero += s.count('0') # count()를 사용해 제거할 '0'의 갯수 카운팅
s = s.replace('0','') # replace()를 사용해 '0' -> ''으로 변경
s = bin(len(s))[2:] # bin()을 사용하면 '0b'가 나오기 때문에 [2:]를 사용해 숫자만 나오도록 함
return [cnt, cnt_zero]
bin()
을 활용한 이진수 만들기. (이때 '0b'가 앞에 나오기 때문에 [2:]
해주기)<str>.count()
를 활용한 갯수 카운팅<str>.replace()
를 활용한 문자열 바꾸기다른 분들은 0의 개수를 세지 않고, 1의 개수를 카운팅한 후, 기존 문자열(s) 길이-s.count('1')
를 해줌으로써 0의 개수를 카운팅해줬다.
def solution(s):
a, b = 0, 0
while s != '1':
a += 1
num = s.count('1')
b += len(s) - num
s = bin(num)[2:]
return [a, b]