Algorithm/Algorithm
[자료구조/알고리즘] 비트연산을 통한 순열
사랑우주인
2021. 1. 11. 18:38
[Algorithm] Binary Counting - 부분집합, power set 구하기
void main(void){
int i, j;
char arr[4] = { 'a', 'b', 'c', 'd' };
int n = 4;
for (i = 0; i < (1 << (n)); i++){
for (j = 0; j < n; j++){
if (i & (1 << j)){
printf("%c ", arr[j]);
}
}
printf("\n");
}
}
1<<n
- 2n의 값을 갖는다.
- 원소가 n개일 경우의 모든 부분집합의 수를 의미한다.
- Power set(모든 부분 집합)
-공집합과 자기 자신을 포함한 모든 부분집합
-각 원소가 포함되거나 포함되지 않는 2가지 경우의 수를 계산하면 모든 부분집합의 수가 계산된다.
i & (1 << j)
- 계산 결과는 i의 j번째 비트가 1인지 아닌지를 의미한다.
| 10 진수 | 이진수 | {A, B, C, D} |
|---|---|---|
| 0 | 0000 | |
| 1 | 0001 | A |
| 2 | 0010 | B |
| 3 | 0011 | B, A |
| 4 | 0100 | C |
| 5 | 0101 | C, A |
| 6 | 0110 | C, B |
| 7 | 0111 | C, B, A |
| 8 | 1000 | D |
| 9 | 1001 | D, A |
| 10 | 1010 | D, B |
| 11 | 1011 | D, B, A |
| 12 | 1100 | D, C |
| 13 | 1101 | D, C, A |
| 14 | 1110 | D, C, B |
| 15 | 1111 | D, C, B, A |