[c++] μκ³ λ¦¬μ¦ κ°λ κ³΅λΆ :: μμ΄κ³Ό μ‘°ν© (μ½λ, next_permutation μ΄μ©, μ§μ ꡬν)
μμ΄κ³Ό μ‘°ν©
μμ΄
μ μ
μμ΄μ μ€λ³΅μμ΄ 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;
}