Skip to content

Latest commit

Β 

History

History
45 lines (41 loc) Β· 1.28 KB

File metadata and controls

45 lines (41 loc) Β· 1.28 KB

Intuition

이전 값듀을 μž¬ν™œμš©ν•œλ‹€.

Approach

  1. μ—£μ§€ μΌ€μ΄μŠ€λŠ” 0을 λ°˜ν™˜ν•œλ‹€.
  2. 0, 1을 미리 κ³„μ‚°ν•œλ‹€.
  3. >>을 μˆ˜ν–‰ν•œ κ²°κ³Ό + 짝/홀 μ—¬λΆ€λ‘œ μΈν•œ 1을 λ”ν•΄μ„œ ν•΄κ²°ν•΄μ€€λ‹€.
  • μ΄μ§„μˆ˜ 1001의 경우 100 κ³„μ‚°ν•œ κ²°κ΄κ°’μ—μ„œ 1을 더해주면 λœλ‹€.

  • μ΄μ§„μˆ˜ 1010의 경우 101 κ³„μ‚°ν•œ κ²°κ΄κ°’μ—μ„œ 0을 더해주면 λœλ‹€.

  • μ†”λ£¨μ…˜ μ°Έκ³ : i & (i-1) 연산을 톡해 κ³„μ‚°ν•œλ‹€.

    • 2의 제곱수인 경우 0이 λ‚˜μ™€ 1을 λ”ν•˜λ©΄ λœλ‹€.
    • μ•„λ‹Œ κ²½μš°λŠ” 아직은 잘 λͺ¨λ₯΄κ² λ‹€.

Complexity

  • Time complexity: $$O(n)$$

:n크기의 배열을 λͺ¨λ‘λ₯Ό μˆœνšŒν•œλ‹€.

  • Space complexity: $$O(n)$$

:크기 n의 배열을 μ„ μ–Έν•œλ‹€.

Code

func countBits(n int) []int {
	if n == 0 {
		return []int{0}
	}
	ans := make([]int, n+1, n+1)

	ans[0], ans[1] = 0, 1

	for i := 2; i <= n; i++ {
		ans[i] = ans[i>>1] + i&1
	}
	return ans
}

func countBitsSolution(n int) []int {
	res := make([]int, n+1)
	for i := 1; i <= n; i++ {
		res[i] = res[i&(i-1)] + 1
	}
	return res
}