[Python] Coda Kata Day16

rang-dev·2020년 7월 4일
0

Wecode - Code Kata

목록 보기
16/18

문제

양수 N을 이진법으로 바꿨을 때, 연속으로 이어지는 0 중에서 가장 큰 값을 return해 주세요.

  • 이어지는 0은 1과 1사이에 있는 것을 의미합니다.
  • 이런 것을 binary gap 이라고 합니다.
input: 9
output: 2
설명: 9의 이진수는 1001 입니다. 
1과 1사이에 있는 0은 2 이므로, 2를 return
input: 529
output: 4
설명: 529의 이진수는 1000010001 입니다. 
1과 1사이에 있는 연속된 0의 수는 4와 3입니다.
이 중 큰 값은 4이므로 4를 return
input: 20
output: 1
설명: 20의 이진수는 10100 입니다. 
1과 1사이에 있는 연속된 0의 수는 1 뿐입니다.
(뒤에 있는 0은 1사이에 있는 것이 아니므로)
input: 15
output: 0
설명: 15의 이진수는 1111 입니다. 
1과 1사이에 있는 0이 없으므로 0을 return
input: 32
output: 0
설명: 32의 이진수는 100000 입니다. 
1과 1사이에 있는 0이 없으므로 0을 return

내코드

def solution(N):
  binary_a = format(N, 'b')
  count = 0
  count_list = []
  for i in binary_a:
    if i == '0':
      count += 1
    else:
      count_list.append(count)
      count = 0
  
  return max(count_list)

나는 2진수로 변환된 수를 for문에 돌려서 1이 나올때까지 0을 세어 list에 각각 추가하고 그 list안에서 숫자가 가장 큰 것을 return하도록 했다.

답안을 보다가 모든 0이 아니라 1과 1의 사이에 있는 0을 세어야했다는 것을 깨달았다. 내 답안은 그런 경우를 고려하지 않았으므로 테스트는 통과했지만 오답이다. 정답이 되려면 model solution처럼 strip()을 해준 뒤에 for문을 돌려야한다.

Model Solution

def solution(N):
  binaryNumber = format(N, 'b')
  maximum = 0
  binaryNumberList = binaryNumber.strip('0').split('1')
  
  for x in binaryNumberList:
    if not x:
      continue
    if len(x) > maximum:
      maximum = len(x)
      
  return maximum

답안에서는 앞뒤의 0을 모두 strip()으로 제거하고 split('1')으로 1 사이에 있는 값들을 리스트로 가져왔다. 110010101011인 2진수를 split하면 ['', '', '00', '0', '0', '0', '', '']와 같은 리스트가 나온다. 여기서도 for문을 돌면서 만약 요소가 비었다면 다음의 요소로 이동하고 그 요소의 길이(=0의 갯수)가 가장 큰 값을 찾는다.

strip()함수 알아보기

profile
지금 있는 곳에서, 내가 가진 것으로, 할 수 있는 일을 하기 🐢

0개의 댓글