https://school.programmers.co.kr/learn/courses/30/lessons/70129
일단 문제를 파악해 보면,
이다.
생각보다 금방 풀기도 했지만, 정신없이 풀다 보니 결과가 이렇다.
def solution(s):
binary_cnt = 0
zero_cnt = 0
while s != 1:
zero_cnt += s.count("0")
s = s.replace("0", "")
binary_cnt += 1
if len(s) == 1:
return [binary_cnt, zero_cnt]
s = bin(len(s))[2:]
return [binary_cnt, zero_cnt]
(코드가 못생겼어~~~)
좀 더 가독성 좋게, 또 좀 더 빠르게 만들고 싶어서 손봤다.
def solution(s):
binary_cnt = 0
zero_cnt = 0
while s != "1":
binary_cnt += 1
zero_cnt += s.count("0")
s = s.replace("0", "")
s = bin(len(s))[2:]
return [binary_cnt, zero_cnt]
꽤나 깔끔해지긴 했는데, 속도가 아쉽다. 그래서 다른 사람의 풀이를 살피니 머리를 한 대 맞은 것 같은 풀이가 있었다!!!
포인트는, 이진수에서 "0을 제거한 길이" == "1의 갯수" 라는 거다.
0을 count하고 0을 replace할 것이 아니라, 1을 count한 후 s의 길이에서 1의 갯수를 빼면 그것이 제거한 0의 갯수가 되고, 또 1의 갯수가 곧 0을 제거한 길이이므로 그냥 그걸 바로 bin( )으로 이진수로 변환하면 끝난다.
def solution(s):
binary_cnt = 0
zero_cnt = 0
while s != "1":
tmp = s.count("1")
binary_cnt += 1
zero_cnt += len(s) - tmp
s = bin(tmp)[2:]
return [binary_cnt, zero_cnt]
와~우
조금 더 논리적으로 생각해야겠다고 다짐했다.