less than 1 minute read

1. 개요

2. 재귀호출 풀이

def solution(n, l, r):
    # l과 r사이의 구간에서의 1의 갯수는
    # r까지의 1의 갯수에서 l-1까지의 1의갯수를 뺀것이다.
    return oneCount(r)-oneCount(l-1)

def oneCount(n):
    # 남은 숫자가 5이하일경우 1의 갯수를 그냥 구한다.
    if n <= 5:
        return '11011'[:n].count('1')

    # n보다 작거나 같은 최대의 5의 제곱수를 구한다.
    # 그리로 부터 5토막을 내는 단위(divider), 한토막당 1의 갯수를 구할수 있다.
    curPower = getPowerOfFive(n)
    divider, sectionOneCount = 5**(curPower), 4**(curPower)
    mock, remain = n//divider, n%divider
    result = mock*sectionOneCount

    # 2토막이면 바로 갯수를 반환한다.
    # 3토막 이상이면 3토막째에는 1의 갯수가 0이므로, 한토막당 1의갯수를 빼줘야 한다.
    if mock==2:
        return result
    if mock>=3:
        result -= sectionOneCount
    
    # 토막을 내고 남은 숫자에 대해서 다시 5토막을 내서 재귀적으로 답을 구한다.
    if remain:
        return result + oneCount(remain)
    else:
        return result
            
def getPowerOfFive(num):
    power = 1
    while 5**(power+1) < num:
        power += 1
    return power

Leave a comment