순열을 사용하여 조합을 만들어내는 방법입니다.
로직을 설명하면 vector <int>를 2개를 선언하고
하나는 원소를 삽입하는 vector <int> list를
또 다른 하나는 순서 제어를 위해서
next_permutation을 사용할 vector <int> idx를 만듭니다.
이어서
몇 개의 원소를 뽑을지 결정하는 변수 r 만큼
idx에 1을
list의 크기 (n이라고 하겠습니다) - r 만큼
idx에 0을 넣습니다.
그 뒤로 idx를 next_permutation을 사용하여 반복하여
idx의 원소가 1일 때마다 list의 원소를 출력해주면 됩니다.
저는 내림차순으로 출력하기 위해서 desc라는 함수를 따로 작성하였습니다.
소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | // Combination // using STL's next_permutation #include<iostream> #include<algorithm> #include<vector> using namespace std; bool desc(int a, int b){ return a > b; } int main(){ int n; int r; vector<int> idx; vector<int> list; cout << "몇 개의 원소를 가진 배열입니까?" << '\n'; cin >> n; cout << "원소를 삽입하세요" << '\n'; for(int i = 0; i < n; i++){ int tmp; cin >> tmp; list.push_back(tmp); } cout << "몇 개의 원소를 뽑아냅니까?" << '\n'; cin >> r; for(int i = 0; i < r; i++) idx.push_back(1); for(int i = 0; i < n-r; i++) idx.push_back(0); sort(idx.begin(), idx.end(),desc); do{ for(int i = 0; i < n; i++){ if(idx[i] == 1) cout << list[i]; } cout << '\n'; }while(next_permutation(idx.begin(), idx.end(),desc)); return 0; } | cs |
※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다.
'C_C++ 프로그래밍 > C_C++ 프로그래밍' 카테고리의 다른 글
유니온 파인드란?? (Union-Find) (0) | 2019.05.12 |
---|---|
[C++] 소수 구하기 (에라토스테네스의 체) (8) | 2019.04.22 |
[C++] 삽입 정렬 (Insertion Sort) (0) | 2019.04.01 |
[C++] 버블 정렬(Bubble Sort) (0) | 2019.04.01 |
댓글