์์ด๊ณผ ์กฐํฉ
์์ด
์ ์
์์ด์ ์ค๋ณต์์ด n๊ฐ ์ค r๊ฐ๋ฅผ ๋ฝ์ ์์๋ฅผ ์ ํด ๋์ดํ๋ ๊ฒฝ์ฐ์ด๋ค. ์์ ๊ทธ๋ฆผ์ฒ๋ผ A, B, C ์ธ๊ฐ์ง ์์๊ฐ ์์ ๋, 2๊ฐ๋ฅผ ๋ฝ์ ์์๋ฅผ ์ ํ๋ ๊ฒ์ 3P2
๋ผ๊ณ ํ๋ค. ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ๋์ค๋ฏ๋ก ์ด 6๊ฐ์ง ์ด๋ค.
์์ด์ P(Permutation)๋ก ํํํ๋ฉฐ ์์ ๋ค์๊ณผ ๊ฐ๋ค.
$$
{}n\mathrm{P}{r} = \frac{n!}{(n-r)!}
$$
์ค๋ณต ์์ด์ด๋ผ๋ ํน๋ณํ ๊ฒฝ์ฐ๋ ์์ด ์ค ๊ฐ์ ์ข ๋ฅ์ ๊ฒ์ ๋ค์ ๋ฝ์ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
์ค๋ณต ์์ด์ Π๋ก ํํํ๋ฉฐ ์์ ๋ค์๊ณผ ๊ฐ๋ค.
$$
{n}\mathrm{\pi}{r} = n^r
$$
๊ตฌํ
์์ด
// ์ง์ ๊ตฌํ
void swap(vector<int>& set, int a, int b){
int tmp = set[a];
set[a] = set[b];
set[b] = tmp;
}
void permutation(vector<int>& set, int size, int n, int r){
if(size==r){
for(int i=0; i<size; i++)
cout << set[i] << " ";
cout << endl;
return;
}
for(int i=size; i<n; i++){
swap(set, i, size);
permutation(set, size+1, n, r);
swap(set, i, size);
}
}
int main()
{
vector<int> set;
set.push_back(1);
set.push_back(2);
set.push_back(3);
combination(set, 0, 3, 2);
return 0;
}
// next_permutation ์ด์ฉ
void permutation(vector<int>& set, int n, int r){
do{
for(int i=0; i<r; i++)
cout << set[i] << " ";
cout << endl;
}while(next_permutation(set.begin(), set.end()));
}
int main()
{
vector<int> set;
set.push_back(1);
set.push_back(2);
set.push_back(3);
combination(set, 3, 2);
return 0;
}
์ค๋ณต ์์ด
void repeatedPermutation(vector<int>& set, vector<int>&tmp, int size, int n, int r){
if(size==r){
for(int i=0; i<size; i++)
cout<< tmp[i] << " ";
cout << endl;
return;
}
for(int i=0; i<n; i++){
tmp[size] = set[i];
permutation(set, tmp, size+1, n, r);
tmp[size] = 0;
}
}
int main()
{
vector<int> set;
set.push_back(1);
set.push_back(2);
set.push_back(3);
vector<int>tmp(3);
repeatedPermutation(set,tmp,0, 3, 2);
return 0;
}
์ค๋ณต ์์ด์ ๊ตฌํ๊ธฐ ์ํด์ tmp๋ผ๋ vector๋ฅผ ํ๋ ๋ ์ฌ์ฉํ์๋ค. ๋ฐ๋ก vector๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น?
์กฐํฉ
์ ์
์กฐํฉ์ ์ค๋ณต์์ด n๊ฐ ์ค r๊ฐ๋ฅผ ์์์ ์๊ด์์ด ๋ฝ๋ ๊ฒฝ์ฐ์ด๋ค. ์์ ๊ทธ๋ฆผ์ฒ๋ผ A, B, C ์ธ๊ฐ์ง ์์๊ฐ ์์ ๋, 2๊ฐ๋ฅผ ์์์ ์๊ด์์ด ๋ฝ๋ ๊ฒ์3C2
๋ผ๊ณ ํ๋ค. ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ๋์ค๋ฏ๋ก ์ด 3๊ฐ์ง์ด๋ค.
์กฐํฉ์ C(Combination)๋ก ํํํ๋ฉฐ ์์ ๋ค์๊ณผ ๊ฐ๋ค.
$$
{n}\mathrm{C}{r} = \frac{{n}\mathrm{P}{r}}{r!} \ ({n}\mathrm{C}{0},\ {n}\mathrm{C}{n}์\ 0)
$$
$$
{n}\mathrm{C}{r} = {n-1}\mathrm{C}{r-1}+{n-1}\mathrm{C}{r}
$$
์ค๋ณต ์กฐํฉ์ด๋ผ๋ ํน๋ณํ ๊ฒฝ์ฐ๋ ์กฐํฉ ์ค ๊ฐ์ ์ข
๋ฅ์ ๊ฒ์ ๋ค์ ๋ฝ์ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
์ค๋ณต ์กฐํฉ์ H๋ก ํํํ๋ฉฐ ์์ ๋ค์๊ณผ ๊ฐ๋ค.
$$
{n}\mathrm{H}{r} = {n+r-1}\mathrm{C}{r}
$$
$$
{n}\mathrm{H}{r} = {n}\mathrm{H}{r-1} +{n-1}\mathrm{H}{r}
$$
๊ตฌํ
์กฐํฉ
// ์ง์ ๊ตฌํ
void swap(vector<int>& set, int a, int b){
int tmp = set[a];
set[a] = set[b];
set[b] = tmp;
}
void combination(vector<int>& set, int idx, int size, int n, int r){
if(size==r){
for(int i=0; i<size; i++)
cout << set[i] << " ";
cout << endl;
return;
}
for(int i = idx; i<n; i++){
swap(set, i, size);
combination(set, i+1, size+1, n, r);
swap(set, i, size);
}
}
int main()
{
vector<int> set;
set.push_back(1);
set.push_back(2);
set.push_back(3);
combination(set, 0, 0, 3, 2);
return 0;
}
// next_permutation ์ด์ฉ
void combination(vector<int>& set, vector<int>& tmp, int n, int r){
do{
for(int i=0; i<n; i++){
if(tmp[i]==1)
cout << set[i] << " ";
}
cout << endl;
}while(next_permutation(tmp.begin(), tmp.end()));
}
int main()
{
vector<int> set;
set.push_back(1);
set.push_back(2);
set.push_back(3);
vector<int> tmp;
tmp.push_back(0);
tmp.push_back(1);
tmp.push_back(1);
// ์ฃผ์!! 0, 1, 1 ์ค๋ฆ์ฐจ์ ์์๋ก ์จ์ผ next_permutation์ด ์์ฉํ๋ค.
// ์๋๋ฉด ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ ํ prev_permutation๋ ๊ฐ๋ฅ
combination(set, tmp, 3, 2);
return 0;
}
์ค๋ณต ์กฐํฉ
void repeatedCombination(vector<int>& set, vector<int>& tmp, int size, int index, int n, int r){
if(size==r){
for(int i=0; i<size; i++)
cout << tmp[i] << " ";
cout << endl;
return;
}
for(int i=index; i<n; i++){
tmp[size] = set[i];
repeatedCombination(set, tmp, size+1, i, n, r);
}
}
int main()
{
vector<int> set;
set.push_back(1);
set.push_back(2);
set.push_back(3);
vector<int> tmp(3);
repeatedCombination(set, tmp, 0, 0, 3, 2);
return 0;
}
Comment