[Codility] Lesson 1 BinaryGap 파이썬

현지·2025년 12월 16일

코테 준비

목록 보기
1/10

문제풀이

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 

고민 포인트

  1. 0을 감싸는 시작'1'과 끝나는 '1'의 차이를 무슨 수로 구분하지
  2. 이진수 변환 어케 시키지

2번은 파이썬에 bin()이라는 편리한 이진수 변환 함수를 이용하였다. 2진수임을 나타내는 접두사 0b가 붙어서 슬라이싱으로 제거해줬다.
1번은 '1'일때 count_0 > 0이라는 조건을 추가해줬는데, 첫 번째 인덱스의 '1'과 '1'이 연속되어서 오는 경우에는 count_0변수가 증가되지 않아 0일 거라는 생각에서였다.

트러블 슈팅

저 상태의 코드로 제출했더니 테스트 케이스 3개중 2개만 자꾸 통과했다. 결과적으로 놓친 부분이
1. char == 1char == 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 


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

profile
헤맨만큼 내 땅이다

0개의 댓글