NIRVANA
[level 2] 이진 변환 반복 본문
문제
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 함수를 완성해주세요.
문제 풀이 접근법1
1) count_change(이진변환 수), count_remove(0 삭제 개수), c(처음 s의 길이)를 정의한다.
2) c의 길이만큼 반복문을 돌린다.
3) s에서 0의 개수를 count로 구한 다음, replace함수를 사용하여 0을 ' '로 바꿔 문자열에서 삭제한다.
4) format함수를 사용하여 s의 길이(10진수)를 2진수로 변환한다. 이때, count_chage에 +1을 한다.
5) 만약 s 안에 0이 없고, s의 길이가 1이면 반복문을 탈출한다.
def solution(s):
count_change = 0
count_remove = 0
c = len(s)
for i in range(c):
count_remove += s.count('0')
s = s.replace('0', '')
s = format(len(s), 'b')
count_change+=1
if '0' not in s and len(s) == 1:
break
return [count_change, count_remove]
원래는 while True로 무한 반복 할려고 했는데
너무 시간이 오래 걸려서 일단 처음 s 길이만큼 for문 돌리고 조건을 만족하면 탈출하는 걸로 했다.
다른 분들 풀이
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]
a는 이진변환을 한 수, b는 삭제한 0의 개수이다.
그다음에 s = bin(num)[2:]는 s에서 0을 삭제한 다음의 s의 길이(==1만 있으므로)를 bin함수로 2진변환한 후, 앞에 문자열을 빼기 위해 슬라이싱 해준 것!
와...이렇게도 할 수 있네...
원래 s의 길이에서 1의 개수를 빼면 0의 개수가 나오는거...생각도 못했다.
참고: https://minnit-develop.tistory.com/17
이진수 변환!!!
format(변환숫자, 'b') 외우자(제발)
'Coding test(Python3) > Programmers' 카테고리의 다른 글
[level 2] 다음 큰 숫자 (0) | 2023.09.30 |
---|---|
[level 2] 숫자의 표현(다시 풀기!!) (0) | 2023.09.28 |
[level 2] 올바른 괄호 (다시 풀어보기!) (0) | 2023.09.17 |
[level 2] 최솟값 만들기(규칙 나중에 다시 고민해보기) (0) | 2023.09.16 |
[level 2] JadenCase 문자열 만들기 (0) | 2023.09.16 |