문제
https://leetcode.com/problems/counting-bits/
문제 풀기 전
앞에 푼 데이터를 이용하면 되겠다라는 생각이 들었다.
0이면 0
1이면 12이면 10 <<앞에 이미 구한 0에서 1만 추가됨
3이면 11 <<앞에 이미 구한 1에서 1만 추가됨4이면 100 <<앞에서 이미 구한 0에서 1만 추가됨
5이면 101 <<앞에서 이미 구한 1에서 1만 추가됨
6이면 110 <<앞에서 이미 구한 2에서 1만 추가됨
이런 규칙을 발견했다. 이걸 구현하기만 하면 되었다.
직접 푼 풀이
소요시간: 30분(21:09 ~ 21:39)
class Solution {
public int[] countBits(int num) {
if (num == 0) {
return new int[]{0};
}
int[] box = new int[num+1];
box[0] = 0;
box[1] = 1;
int len = 2;
int index=1;
while(true) {
if (index == num) {
break;
}
for(int i=0; i<len; i++) {
if (index == num) {
break;
}
box[++index] = box[i]+1;
}
len = index+1;
}
return box;
}
}
느낀점
아이디어는 그래도 바로 생각났는데 구현이 생각보다 어려웠다. 한번 좀 익혀둘 필요가 있다.
나는 bit 연산을 사용하지 않았지만, 실제로 비트 연산을 하면 더 쉽게 간단하게 나타낼 수 있다.
그리고 내가 푼 방식은 dp + Most Significant Bit으로 이진법 맨 앞자리 수를 채워가는 것이었다면 반대로 뒤에를 하나씩 채워가는 DP + Least Significant Bit 방법도 있다.
2: 10
3: 11
4: 100 << 2(10)에다가 뒤에 0을 붙이면 된다.
5: 101 << 2(10)에다가 뒤에 1을 붙이면 된다.
6: 110 << 3(11)에다가 뒤에 0을 붙이면 된다.
솔루션 공부 후 추가로 푼 풀이
#DP + Least Significant Bit
class Solution {
public int[] countBits(int num) {
int[] box = new int[num+1];
box[0]=0;
for (int i=1; i<=num; i++) {
box[i] = box[i >> 1] + (i & 1);
}
return box;
}
}
누적되는 알고리즘 접근 설명서
'알고리즘 풀이' 카테고리의 다른 글
.leetcode(46. Permutations) (0) | 2021.01.15 |
---|---|
.leetcode(406. Queue Reconstruction by Height) (0) | 2021.01.14 |
.leetcode(763. Partition Labels) (0) | 2021.01.13 |
.leetcode(20. Valid Parentheses) (0) | 2021.01.13 |
.leetcode(155. Min Stack) (0) | 2021.01.09 |