문제
요약
- 0과 1로 이루어진 문자열이 주어진다.
- x의 모든 0을 제거하고, x의 길이 c에 대해, x를 “c를 2진법으로 표현한 문자열”로 바꾼다. 이를 “이진 변환”이라고 하자.
- s가 1이 될 때까지 계속 “이진 변환”을 반복했을 때, 이진 변환의 횟수와, 제거된 모든 0의 개수를 각각 배열에 담아 리턴.
분류
- 문자열 : 진법 바꾸기
풀이
1. 내 풀이
- 그냥 스탠다드한 방법이다. 진법 변환에 while 을 사용했다. 따로 빼서 함수로 만들어주었다.
- divmod() 함수를 사용하면 코드가 더 간결해진다.
def convertNum(num):
num = int(num)
arr = []
while True:
if num // 2 == 0:
arr.append(num)
break
arr.append(num % 2)
num //= 2
return ''.join(map(str, arr[::-1]))
def solution(s):
times = 0; num_0 = 0
while int(s) != 1:
times += 1
l = len(s)
s = s.replace('0', '')
num_0 += l - len(s)
s = convertNum(len(s))
return [times, num_0]
2. 최적화 풀이
- <취업과 이직을 위한 프로그래머스 코딩테스트 문제 풀이 전략> 을 참고한 코드입니다. (링크)
- bin() 함수를 기억하자. (10진수 -> 2진수)
- 추가로 알아둘 함수들
-
from to 함수 n진수 10진수 int(string, n) 10진수 2진수 bin() 10진수 8진수 oct() 10진수 16진수 hex() => bin(), oct(), hex() 함수의 반환값은 문자열이다.
def solution(s):
change, zero = 0, 0
while s != '1':
change += 1
num = s.count('1')
zero += len(s) - num
s = bin(num)[2:]
return [change, zero]