n
: 입력되는 정수 ()
입력되는 정수 n
에 따라 n+1
크기의 배열 arr
을 반환하는 문제이다.
arr
은 0부터 n
에 해당하는 각 요소 i
를 이진수로 나타냈을 때 1의 개수를 저장한 배열이다.
이를 구하기 위해선 arr
을 만들고 각 요소들을 이진수 변환해준 후 1의 개수만 세어서 저장하면 된다.
for문 →
이진수 변환 →
count함수로 1의 개수 찾기 →
최종 시간복잡도
최악의 경우 이므로 충분히 동작할 수 있다.
class Solution:
def countBits(self, n: int) -> List[int]:
# 1의 개수 저장할 리스트 정의
ans = []
# 0부터 n까지를 담고 있는 리스트 정의
n_list = [i for i in range(n+1)]
# 배열에 접근해 이진수 변환 후 1의 개수 세기
for n in n_list:
n_bi = bin(n)
ans.append(n_bi.count('1'))
return ans
class Solution:
def countBits(self, n: int) -> List[int]:
# 2의 거듭제곱 숫자 의미
offset = 1
# 0부터 n까지 1의 개수 저장할 리스트 초기화
dp = [0] * (n + 1)
# 1부터 n까지 반복해 1의 개수 계산
for i in range(1, n+1):
# i가 다음 2의 거듭제곱 수가 되면 Offset을 i로 업데이트
if offset * 2 == i:
offset = i
# dp[i]는 offset보다 큰 숫자의 1의 개수는 offset을 뺀 수의 1의 개수 + 1
# (예: 6 (110 in binary) -> offset=4, 6-4=2, dp[2]=1, 따라서 dp[6]=1+1=2)
dp[i] = 1 + dp[i-offset]
return dp