지난 글에서 중복조합에 대해서 알아보았다. 이번 시간에는 중복 순열에 대해서 알아보도록 하자.
[ 조합 알아보기(Click) ]
[ 순열 알아보기(Click) ]
[ 중복조합 알아보기(Click) ]
중복순열을 알아보기전, 먼저 순열에 대해서 한번 더 복습하고 가도록 하자.
순열이라는 것은 순서가 존재하는 수열이기 때문에, { 1, 2 } 와 { 2, 1 } 이 다른 경우이다 라는 것을 말했었다.
중복순열은 이 내용에서 중복이 허용되었다는 점이 추가된 것이다.
즉, { 1, 2, 3 } 에서 2개를 뽑을 때 일반순열의 경우 { 1, 2 } , {1, 3} , { 2, 1} , {2, 3}, { 3, 1}, {3 , 2} 를 출력할 수 있다.
하지만 중복순열의 경우, 뽑았던 카드를 또 뽑아도 되는 중복이 허용되기 때문에 결과가
{ 1, 1 } , { 1, 2}, {1, 3}, { 2, 1 } , {2, 2 }... 이런식으로 진행될 것이다.
그렇다면 어떻게 구현해야 하는지 소스코드를 보고 구체적으로 알아보도록 하자.
[ 소스코드 ]
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 | #include<iostream> #define endl "\n" #define MAX 5 using namespace std; int Arr[MAX]; int Select[MAX]; void DFS(int Cnt) { if (Cnt == 3) { cout << " { "; for (int i = 0; i < 3; i++) { cout << Select[i] << " "; } cout << "} " << endl; return; } for (int i = 0; i < MAX; i++) { Select[Cnt] = Arr[i]; DFS(Cnt + 1); } } int main(void) { for (int i = 0; i < MAX; i++) Arr[i] = i + 1; DFS(0); } | cs |
실행결과가 너무 많아서 짤랐다... ( 5개의 숫자 중 3개를 뽑는 중복순열 코드 )
만약, 조합, 순열, 중복조합에 대해서 완벽하게 이해했다면 중복순열은 거저이다. 코드만 봐도 왜 그런지 딱 알 수 있을만큼
너무나도 구현하기 쉽다.
중복조합과 마찬가지로, Select[] 배열이 이미 뽑았니 안뽑았니를 표시해주는 역할이 아닌, 값을 저장해주는 역할을
하고있다. 이 부분은 지난글 에서 충분히 설명했으니, 위의 코드에 대해서만 설명을 하겠다.
보면, 순열 코드와 마찬가지로 재귀호출을 하는 DFS함수에는 Cnt하나만 존재한다. Idx는 순열에서 필요가 없기 때문이다.
또한, for문 안에서 i 가 0부터 반복된다는 점만 유의한다면 중복순열도 쉽게 구현할 수 있을 것이다.
'[ Algorithm ] > # Solution - ' 카테고리의 다른 글
[ 정렬 ] 버블정렬 (Bubble Sort) (C++) (0) | 2019.04.27 |
---|---|
[ 크루스칼 알고리즘 ] 개념과 구현방법 (C++) (8) | 2019.03.03 |
[ 순열과 조합 구현 ] 재귀를 통한 구현(3 - 중복조합) (C++) (2) | 2019.01.31 |
[ 순열과 조합 구현 ] - 재귀를 통한 구현(2 - 순열) (C++) (7) | 2019.01.25 |
[ 순열과 조합 구현 ] - 재귀를 통한 구현(1 - 조합) (C++) (44) | 2019.01.25 |