수학에서 칸토어 집합은 0과 1 사이의 실수로 이루어진 집합으로, [0, 1]부터 시작하여 각 구간을 3등분하여 가운데 구간을 반복적으로 제외하는 방식으로 만들어집니다.
남아는 칸토어 집합을 조금 변형하여 유사 칸토어 비트열을 만들었습니다. 유사 칸토어 비트열은 다음과 같이 정의됩니다.
남아는 n 번째 유사 칸토어 비트열에서 특정 구간 내의 1의 개수가 몇 개인지 궁금해졌습니다.
n과 1의 개수가 몇 개인지 알고 싶은 구간을 나타내는 l, r이 주어졌을 때 그 구간 내의 1의 개수를 return 하도록 solution 함수를 완성해주세요.
(n-1번째 비트열)(n-1번째 비트열)(0이 5^(n-1)만큼 있음)(n-1번째 비트열)(n-1번째 비트열)
l
, r
] 사이의 1의 개수를 구하라는 것은 (r
까지의 1의 개수) - (l-1
까지의 1의 개수) 하라는 것이다.#n에 해당하는 비트열에 대해 k번째 수까지의 1의 개수를 리턴
def f(n, k):
if n==1:
return k if k <= 2 else k-1
sector_length = 5**(n-1)
sector_ones = 4**(n-1)
section = k // sector_length
if k % sector_length == 0:
section -= 1
if section < 2:
return sector_ones * section + f(n-1, k - sector_length * section)
elif section == 2:
return sector_ones * section
else:
return sector_ones * (section-1) + f(n-1, k - sector_length * section)
def solution(n, l, r):
return f(n, r) - f(n, l-1)