Algorithm
[c++] 순열, 중복순열, 조합, 중복조합
angieveloper
2022. 5. 20. 22:51
순열
순서가 존재하고 숫자가 중복되면 안 됨
#include <iostream>
#include <vector>
using namespace std;
int number = 3;
const int MIN_NUMBER = 1;
const int MAX_NUMBER = 6;
vector<int> path(number, 0);
bool visited[MAX_NUMBER + 1];
void print()
{
for (int i : path)
printf("%d ", i);
printf("\n");
}
void permutation(int level)
{
if (level == number)
{
print();
return;
}
for (int i = MIN_NUMBER; i <= MAX_NUMBER; i++)
{
if (visited[i])
continue;
visited[i] = true;
path[level] = i;
permutation(level + 1);
visited[i] = false;
}
}
int main(void)
{
permutation(0);
}
중복순열
순서가 존재하고 숫자가 중복될 수 있음
#include <iostream>
#include <vector>
using namespace std;
int number = 3;
const int MIN_NUMBER = 1;
const int MAX_NUMBER = 6;
vector<int> path(number, 0);
void print()
{
for (int i : path)
printf("%d ", i);
printf("\n");
}
void permutationWithRepetition(int level)
{
if (level == number)
{
print();
return;
}
for (int i = MIN_NUMBER; i <= MAX_NUMBER; i++)
{
path[level] = i;
permutationWithRepetition(level + 1);
}
}
int main(void)
{
combinationWithRepitition(0);
}
조합
순서가 존재하지 않고 숫자가 중복되면 안 됨
#include <iostream>
#include <vector>
using namespace std;
int number = 3;
const int MIN_NUMBER = 1;
const int MAX_NUMBER = 6;
vector<int> path(number, 0);
void print()
{
for (int i : path)
printf("%d ", i);
printf("\n");
}
void combination(int level, int idx)
{
if (level == number)
{
print();
return;
}
for (int i = idx; i <= MAX_NUMBER; i++)
{
path[level] = i;
combination(level + 1, i + 1);
}
}
int main(void)
{
combination(0, MIN_NUMBER);
return 0;
}
중복조합
순서가 존재하지 않고 숫자가 중복될 수 있음
#include <iostream>
#include <vector>
using namespace std;
int number = 3;
const int MIN_NUMBER = 1;
const int MAX_NUMBER = 6;
vector<int> path(number, 0);
void print()
{
for (int i : path)
printf("%d ", i);
printf("\n");
}
void combinationWithRepitition(int level, int idx)
{
if (level == number)
{
print();
return;
}
for (int i = idx; i <= MAX_NUMBER; i++)
{
path[level] = i;
combinationWithRepitition(level + 1, i);
}
}
int main(void)
{
combinationWithRepitition(0, MIN_NUMBER);
}
number : 순열/조합을 몇 개 선택할 건지
MIN_NUMBER : 선택하려는 연속하는 숫자 중 가장 작은 숫자
MAX_NUMBER : 선택하려는 연속하는 숫자 중 가장 큰 숫자
세 변수를 상황에 맞게 수정해서 응용 가능하다