참고 자료 : https://hongchan.tistory.com/5
위의 블로그를 참고하여, 정리하였으며 추가적으로 정리할 부분도 추가하였습니다.
#include <iostream>
#include <vector>
using namespace std;
int n = 3, r = 2;
int arr[3] = {1,2,3}; //arr[n]
vector<int> v;
bool check[4] = {false, }; //check[n] -> 중복 제거
void permutation(int cnt){
//nPr : n개 중에 r개를 뽑아 나열할 수 있는 경우의 수(중복 허용x)
if(cnt == r){
for(int i : v){
cout<<i<<" ";
}
cout<<"\n";
return;
}
for(int i=0; i<n; i++){
if(!check[arr[i]]){
v.push_back(arr[i]);
check[arr[i]] = true;
permutation(cnt+1);
check[arr[i]] = false;
v.pop_back();
}
}
}
int main(){
permutation(0);
}
결과
1 2
1 3
2 1
2 3
3 1
3 2
https://www.acmicpc.net/problem/15649
#include <iostream>
#include <vector>
using namespace std;
int n = 3, r = 2;
int arr[3] = {1,2,3}; //arr[n]
vector<int> v;
void permutation(int cnt){ //중복순열
if(cnt == r){
for(int i : v){
cout<<i<<" ";
}
cout<<"\n";
return;
}
for(int i=0; i<n; i++){
v.push_back(arr[i]);
permutation(cnt+1);
v.pop_back();
}
}
int main(){
permutation(0);
}
결과
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
https://www.acmicpc.net/problem/15651
https://www.acmicpc.net/problem/9095
#include <iostream>
#include <vector>
using namespace std;
int n = 3, r = 2;
int arr[3] = {1,2,3}; //arr[n]
vector<int> v;
void combination(int cnt, int next){ //조합
if(cnt == r){
for(int i : v){
cout<<i<<" ";
}
cout<<"\n";
return;
}
for(int i=next; i<n; i++){
v.push_back(arr[i]);
combination(cnt+1, i+1);
v.pop_back();
}
}
int main(){
combination(0,0);
}
결과
1 2
1 3
2 3
https://www.acmicpc.net/problem/15650
#include <iostream>
#include <vector>
using namespace std;
int n = 3, r = 2;
int arr[3] = {1,2,3}; //arr[n]
vector<int> v;
void combination(int cnt, int next){ //조합
if(cnt == r){
for(int i : v){
cout<<i<<" ";
}
cout<<"\n";
return;
}
for(int i=next; i<n; i++){
v.push_back(arr[i]);
combination(cnt+1, i);
v.pop_back();
}
}
int main(){
combination(0,0);
}
결과
1 1
1 2
1 3
2 2
2 3
3 3
https://www.acmicpc.net/problem/15652