Algorithm/문제 풀이

[Codility] BinaryGap

비번변경 2025. 3. 31. 23:23

문제

문제 : https://app.codility.com/programmers/lessons/1-iterations/binary_gap/

양의 정수 N에서 바이너리 갭은 이진수에서 양 끝이 1로 둘러싸인 연속된 0의 최대 수이다.

예로 들어, 숫자 9는 이진수로 1001이고, 길이가 2인 바이너리 갭을 가진다. 숫자 529는 이진수로 1000010001이며, 길이가 4이고 3인 두 개의 바이너리 갭을 가진다. 숫자 20인 이진수로 10100이고 길이가 1인 바이너리 갭을 가지고, 숫자 15는 이진수로 1111이고 바이너리 갭을 갖고 있지 않다. 숫자 32 또한 이진수로 100000으로 바이너리 갭을 가지고 있지 않다.

 

양의 정수 N이 주어지면 가장 긴 바이너리 갭의 길이를 반환하는 함수를 작성하라. N에 바이너리 갭이 없드면 0을 반환해야 하며, N은 1 ~ 2,147,483,647 범위 내의 정수이다.

 

 

풀이

앙의 정수 N을 이진수로 변환한 뒤, 값이 1인 자릿값 간의 차이를 계산하여 그 최대값을 반환하는 방식으로 구현했다.

def solution(N):
    # 이진수 문자열로 변환
    str_n = str(bin(N))[2:]
    
    # 값이 1인 자릿수를 구한다.
    list_idx = [i for i in range(len(str_n)) if str_n[i] == '1']
    
    # 1인 값이 없거나 하나이면 0을 반환
    if len(list_idx) <= 1:
        return 0
    # 1인 값이 2 이상이면 자릿수 차이의 최댓값 반환
    else:
        gap = [list_idx[i + 1] - list_idx[i] - 1 for i in range(len(list_idx) - 1)]
        return max(gap)

 

 

참고 문서

https://app.codility.com/programmers/lessons/1-iterations/binary_gap/

 

 

728x90