갯수를 묻는 문제와 나열의 묻는 문제는 사실상 다른 문제이다. 물론 같은 솔루션으로 푸는것도 가능은 하다.
우리는 먼저 나열 하는 법 부터 해보도록하자.
#include <stdio.h> #define MAXSIZE 1001 int N, K; int arr[MAXSIZE]; int res[MAXSIZE]; int cnt; void print_arr() { for (int k = 1; k <= K; k++) { printf("%d ", res[k]); } printf("\n"); }
void comb(int n, int k) { cnt++; if (k > K) { print_arr(); return; } else if (n > N) { return; } res[k] = arr[n]; comb(n + 1, k + 1); comb(n + 1, k); }
int main() { scanf("%d %d", &N, &K); for (int i = 1; i <= N; i++) { arr[i] = i; } comb(1, 1); printf("cnt : %d", cnt); return 0; }
N과 K는 N개중에 K를 고르는 경우라고 할 수 있다.
배열 arr는 1보다 크고 N보다 작은 자연수로 미리 초기화 시킨다.
cnt는 디버깅용 숫자로 사실 필요하진 않으니 무시해도된다.
실수를 줄이기 위해서 배열의 인덱스 0은 쓰지 않고 진행하겠다.
N의 크기는 1000개 보다 작다고 가정한다. 더 필요하다면 더 쓰면된다.
comb는 재귀로 구현되게 된다.
comb만 중심적으로 보도록 하자.
void comb(int n, int k) { cnt++; if (k > K) { print_arr(); return; } else if (n > N) { return; } res[k] = arr[n]; comb(n + 1, k + 1); comb(n + 1, k); }