티스토리 뷰
이번엔 1부터 n까지의 원소를 가지는 집합으로 만들 수 있는 순열들을 생성하는 알고리즘이다.
재귀 함수로 구현했기 때문에, 재귀함수 사용에 익숙하지않다면, 한 눈에 코드의 동작을 이해하기는 쉽지않을 수 있다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
using namespace std;
#define REP(i,a,b) for(int i = a; i<=b; i++)
typedef vector<int> vi;
const int n = 4;
vi permutation;
bool chosen[n + 1];
void search() {
if (permutation.size() == n){
// 완성된 순열 출력
for (int i = 0; i < permutation.size(); i++)
cout << permutation[i] << " ";
cout << endl;
}
else {
REP(i, 1, n) {
if (chosen[i]) continue;
chosen[i] = true;
permutation.push_back(i);
search();
chosen[i] = false;
permutation.pop_back();
}
}
}
int main() {
search();
}
만약 내장 라이브러리를 사용한다면, algorithm 표준 라이브러리에 있는 next_permutation 함수를 사용할 수 있다.
위의 코드를 아래와 같이 사용하는 것도 동일하다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm> // next_permutation 함수
using namespace std;
#define REP(i,a,b) for(int i = a; i<=b; i++)
typedef vector<int> vi;
const int n = 4;
vi permutation;
void search() {
REP(i, 1, n) {
// 벡터에 1~n까지 숫자 저장
permutation.push_back(i);
}
do {
// 완성된 순열 출력
for (int i = 0; i < permutation.size(); i++)
cout << permutation[i] << " ";
cout << endl;
} while (next_permutation(permutation.begin(), permutation.end()));
}
int main() {
search();
}
실행결과 :
'Programming Languages > C++ & Algorithm' 카테고리의 다른 글
c++ 2차원 동적배열의 참조에 의한 호출 (0) | 2020.09.24 |
---|---|
C++ 반복자 , lower_bound, sort, unique, erase... (0) | 2020.09.23 |
[Algorithm] 입출력 파일 열기 (0) | 2020.09.19 |
재귀 함수를 이용한 부분 집합 생성 알고리즘 (0) | 2020.09.18 |
[Algorithm] ios::sync_with_stdio(0); C++ 입출력 속도 (0) | 2020.09.17 |
댓글