10진수의 수 N이 주어지면, 이 수의 이진수에서 1로 둘러쌓인 최대 연속된 0의 길이를 구하는 문제이다.
def solution(N):
binary_num = bin(N)[2:]
max_count_0 = 0
count_0 = 0
for char in binary_num:
if char == 1 and count_0 > 0: # 앞에 0을 낀 닫히는 1
if max_count_0 < count_0:
max_count_0 = count_0
count_0 = 0
elif char == 0:
count_0 += 1
return max_count_0
2번은 파이썬에 bin()이라는 편리한 이진수 변환 함수를 이용하였다. 2진수임을 나타내는 접두사 0b가 붙어서 슬라이싱으로 제거해줬다.
1번은 '1'일때 count_0 > 0이라는 조건을 추가해줬는데, 첫 번째 인덱스의 '1'과 '1'이 연속되어서 오는 경우에는 count_0변수가 증가되지 않아 0일 거라는 생각에서였다.
저 상태의 코드로 제출했더니 테스트 케이스 3개중 2개만 자꾸 통과했다. 결과적으로 놓친 부분이
1. char == 1 과 char == 0 에서 정수가 아닌 문자열와 비교하는 거라서 작은 따옴표를 붙였어야했다.
2. if max_count_0 < count_0:의 if문 안의 count_0 = 0는 if문 안에 들어있지 말고 밖에 나와야 함. 0의 개수가 max_count_0보다 작을지라도 count_0를 초기화해줘야 하기 때문.
3. if char == 1 and count_0 > 0:에서 count_0 > 0조건은 없어도 됨. 어차피 count_0변수가 0이라면 max_count_0보다 클리가 없으니까.
오류 사항 수정하고 조금 더 가독성 좋게 바꾼 코드
def solution(N):
binary_num = bin(N)[2:]
max_count_0 = 0
count_0 = 0
for char in binary_num:
if char == `0`:
count_0 += 1
elif char == `1`:
if max_count_0 < count_0:
max_count_0 = count_0
count_0 = 0
return max_count_0

테스트 케이스를 전부 통과했다.