(코드카타) - 0이 자꾸 나오는데 몇 개인지 세어보자

문제


양수 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):
  bins = format(N, 'b')
  zero_count = 0
  zero_num = []
  for bin in bins:
    if bin == '0':
      zero_count += 1
    else:
      zero_num.append(zero_count)
      zero_count = 0

  return int(max(zero_num))

format 함수를 이용해서 주어진 N(int)를 2진수 string으로 바꿔주었다. b 앞에 #을 붙여주면 0b가 붙어서 나온다.
이후 2진수로 바뀐 N의 string 0의 개수를 하나씩 세어주었다. 문자가 0이라면 zero_count를 하나씩 올려주고, 아니라면 zero_num 이라는 리스트에 여태까지 발견한 zero_count의 수를 순서대로 넣어주었다.
그런다음 zero_count를 0으로 초기화 시켜서 다시 0부터 세어주게 만들었다. 연속된 0이 필요하니깐!

이후 zero_num에서 가장 큰 수를 리턴해주면 끝!

단점

  1. 난잡한가..?

좋은 웹페이지 즐겨찾기