숫자 n
이 주어지고, 1
부터 n
까지 binary로 변환한 숫자를 이어붙인 숫자를 10**9 + 7
로 나눈 숫자를 출력하는 문제.
example :
n = 3
bin(1) = 1
bin(2) = 10
bin(3) = 11
Thus,
print(int(11011,2)) == 27
풀이 자체는 간단했다. 초기값 1(arr == 1
)을 넣어주고, 2부터 n까지
arr
)에 다음 값(i
)이 들어갈 길이만큼의 binary를 밀어줌.10**9 + 7
로 숫자를 나눠줌.이 과정을 반복한 결과 다음과 같은 식을 짤 수 있다.
class Solution:
def concatenatedBinary(self, n: int) -> int:
arr = 1
for i in range(2,n+1):
arr = ((arr<<len(bin(i))-2) + i)%1000000007
return arr
cf. 이런 선형적인 방법보다 더빠르게 푸는 방법이 존재하는 듯 하다.(정확하지 않음.)
이 식을 썼을 때 1599ms의 시간이 들었고, python의 한계인지는 모르겠지만 더 빠른 결과가 나온 것이 있었다.