Programming/Algorithm
[Algorithm] 순열
100winone
2020. 4. 24. 13:40
- 순열은 조합과 다르게 뽑힌 아이들에도 순서가 있다..!!
과거에 뽑은 아이들도 다시 확인을 해주어야 한다...!!!!
조합은 { 1, 2, 3 }, { 2, 1, 3 }이 같은 취급을 받는다.
순열은 { 1, 2, 3 }, { 2, 1, 3 }이 다른 취급을 받는다.
#include <iostream>
#include <vector>
#define MAX 5
using namespace std;
int arr[MAX];
int check[MAX];
vector<int> v;
void print(){
for (int i = 0; i < v.size(); ++i) {
cout << v[i] << ' ';
}
cout << '\n';
}
void DFS(int cnt){
if(cnt == 3) {
print();
return;
}
for (int i = 0; i < MAX; ++i) {
if(check[i]) continue;
check[i] = true;
v.push_back(arr[i]);
DFS(cnt + 1);
check[i] = false;
v.pop_back();
}
}
int main(){
ios::sync_with_stdio(false);
cout.tie(NULL);
for (int i = 0; i < MAX; ++i) {
arr[i] = i + 1;
}
DFS(0);
return 0;
}
조합과는 다르게 DFS를 부를때 전달하는 파라미터가 cnt 하나로 줄었다. 조합 때에 만약 1을 뽑은적이 있다면 그 이후에는 다시는 1을 뽑을 필요가 없게 하기위해 시작점을 같이 파라미터로 넘겨줬다. ( { 1, 2, 3 } 을 뽑은 후에 { 2, 1, 3 } 이런식으로 뽑지 않기 위해)
순열에서는 { 1, 2, 3 }, { 2, 1, 3 } 이 다른 취급을 받으므로 시작점을 기록할 필요가 없다. 또한 순서가 있으므로 vector에 인자들을 기록했다. 또 DFS를 부른 후에는 vector의 인자를 pop() 한다.
직접 코딩을 해보며 기록해보는 것이 가장 좋은 공부방법이라고 생각한다~!