Brute-force
, Generate-and-Test
기법이라 불림.순열(Permutation)
: 서로 다른 n개의 원소 중 r개를 순서있이 골라낸 것.// 재귀를 통한 순열 : 1 ~ 3에서 3개를 선택하는 순열을 구하는 재귀.
int numbers[] = new int[3];
boolean isSelected[] = new boolean[4];
// 중복 미포함
void permutation(int cnt){
if (cnt == 3)
순열 생성 완료
else{
for (int i = 1; i <= 3; i++){
if (isSelcted[i] != true){
numbers[cnt] = i;
isSelected[i] = true;
permutation(cnt+1)
isSelected[i] = false;
}
}
}
}
// 중복 포함
vodi permutation2(int cnt){
if (cnt == 3)
순열 생성 완료
else
for(int i = 1; i <= 3; i++){
numbers[cnt] = i;
permutation(cnt+1);
}
}
중복 순열
: 서로 다른 것들 중 몇 개를 뽑아 나열하는 것. + 중복 가능.조합(Combination)
: 서로 다른 n개의 원소 중 r개를 순서 없이 골라낸 것.// 재귀를 통한 조합
int input[] = new int[n];
int numbers[] = new int[r];
// 중복 미포함
combination(cnt, start){
if (cnt == r){
조합 생성 완료
}else{
for(int i = start; i < n; i++){
numbers[cnt] = input[i];
combination(cnt+1, i+1);
}
}
}
// 중복 포함
combination2(cnt, start){
if (cnt == r){
조합 생성 완료
}else{
for(int i = start; i < n; i++){
numbers[cnt] = input[i];
combination2(cnt+1, i);
}
}
}
부분 집합(Power Set)
: 집합에 포함된 원소들을 선택하는 것.// 재귀를 통한 부분 집합
int input[]; // 숫자 배열
boolean isSelected[]; //부분 집합에 포함/비포함 여부
generateSubSet(int cnt){
if(cnt == N)
부분집합 완성
else{
// 해당 수 포함하고 부분 집합 생성
isSelected[cnt] = true
generateSubSet(cnt+1)
// 해당 수 포함하지 않고 부분 집합 생성
isSelected[cnt] = false
generateSubSet(cnt+1)
}
}
바이너리 카운팅(Binary COunting)
을 통한 사전적 순서 부분 집합✅ 조건 판단: And(&)
✅ 비트 누적: Or(|)
✅ 특정 위치 비트를 선택: Shift(1<<i)
3개의 원소에 대한 부분 집합 예시
10진수 | 이진수 | {A, B, C} |
---|---|---|
0 | 000 | {} |
1 | 001 | {A} |
2 | 010 | {B} |
3 | 011 | {B, A} |
4 | 100 | {C} |
5 | 101 | {C, A} |
6 | 110 | {C, B} |
7 | 111 | {C, B, A} |
// 바이너리 카운팅을 통한 부분 집합 생성
int arr[] = {1, 2, 3}
int n = arr.length;
for(int i = 0; i < (1 << n); i++){
for(int j = 0; j < n; j++){
if((i & (1 << j)) != 0){
System.out.println(arr[j] + " ");
}
}
System.out.println();
}