순열과 조합의 차이점은 순서가 있냐 없냐의 차이이다.
조합에는 순서가 없기 때문에, 과거에 시작점으로 삼았던 친구는 다시는 쳐다도 보지 말라는 식으로 설명을 했었다.
하지만, 순열은?? 과거에 시작점으로 삼았던 친구를 다시 한번 쳐다봐줘야 한다.
조합 → { 1, 2, 3 } = { 2, 1, 3 } 이므로, 시작점이 2가 되는 순간 더 작은 요소인 1은 쳐다도 보지 말아라 !
순열 → { 1, 2, 3 } != { 2, 1, 3 } 이므로, 시작점이 2가 되더라도 더 작은 요소인 1을 쳐다봐야 한다 !
라는 차이가 있다.
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 47 48 | #include<iostream> #include<vector> #define MAX 5 using namespace std; int Arr[MAX]; bool Select[MAX]; vector<int> V; void Print() { for (int i = 0; i < V.size(); i++) { cout << V[i] << " "; } cout << endl; } void DFS(int Cnt) { if (Cnt == 3) { Print(); return; } for (int i = 0; i < MAX; i++) { if (Select[i] == true) continue; Select[i] = true; V.push_back(Arr[i]); DFS(Cnt + 1); V.pop_back(); Select[i] = false; } } int main(void) { Arr[0] = 1; Arr[1] = 2; Arr[2] = 3; Arr[3] = 4; Arr[4] = 5; DFS(0); } | cs |
< 실행결과는 너무 많아서 짤랐음 ! >
위의 코드를 보면 조합과의 차이부터 한번 봐보자. 일단 DFS를 호출하는 매개변수의 갯수부터 다르다.
시작점을 결정해 주는 친구인 Idx 변수가 없어졌고, Cnt 혼자서만 매개변수로 사용되어지고 있다.
Idx가 없어진 이유는 위의 설명만으로도 충분히 알 수 있을 것이다. 시작점을 다시 한번 쳐다봐야 하기 때문이다 !
또 큰 차이점으로는 Vector가 하나 쓰이고 있다. 물론 이부분은 본인의 코딩스타일 , 코딩방식 이기 때문에 참고만 하자 !
조합에서는 Vector를 사용하지 않은 이유가, 0 ~ Max까지 반복하면서 Select[i] = true인, 즉, 선택당한 놈들이 나올 때 마다
출력을 해주면 그만이었지만, 순열은 그게 안되기 때문이다.
순열도 조합처럼 출력을 한다고 생각해보자. { 1, 2, 3}을 선택해서 출력을 할 것이고, {2, 1, 3}이 되는 순간
{1,2,3}과는 다른 놈이기 때문에 {2,1,3}도 출력을 할 것인데... 0부터 Max까지 반복하면서 Select[i] = true인 놈들을
출력해버리면, 당연히 1이 가장 먼저 있기 때문에 {1,2,3}이 또 출력되게 될 것이다. 따라서 본인은 Vector를 사용해서
선택할 때마다, Vector에 넣어주고 빼주면서 Vector를 출력하는 방식으로 구현을 한다.
1. Cnt가 3이 되었습니다. 원하는 과정을 진행후 Return 시키겠습니다.
그렇다면 지금 우리가 선택한 숫자는 ?? { 1, 2, 3 } 인데... 순서를 보면 벡터에 {1, 3, 2} 순서로 저장되어있다.
이렇게 순열이 출력되는 것이다.
(1)편에서도 말했지만, 이 재귀가 돌아가는 것을 모두 다 이해하기에는 너무나도 복잡하다. 하지만 위에 설명만 잘 이해했고
어떻게 돌아가는지 정도만 알고 있다면, 앞으로 순열과 조합 문제를 구현하는데에는 크게 어려움이 없을 것이라고 생각한다.
너무나도 기본적이고 많이 쓰이는 알고리즘이다 ! 꼭 알아두도록 하자 !
'[ Algorithm ] > # Solution - ' 카테고리의 다른 글
[ 정렬 ] 버블정렬 (Bubble Sort) (C++) (0) | 2019.04.27 |
---|---|
[ 크루스칼 알고리즘 ] 개념과 구현방법 (C++) (8) | 2019.03.03 |
[ 순열과 조합 구현 ] 재귀를 통한 구현(4 - 중복순열) (C++) (2) | 2019.01.31 |
[ 순열과 조합 구현 ] 재귀를 통한 구현(3 - 중복조합) (C++) (2) | 2019.01.31 |
[ 순열과 조합 구현 ] - 재귀를 통한 구현(1 - 조합) (C++) (44) | 2019.01.25 |