기록하는 습관

[C++] 순열과 조합 본문

알고리즘/[개념] C++

[C++] 순열과 조합

로그뉴 2020. 1. 7. 00:52

1. 조합

STL함수 next_permutation을 활용한 조합 구현

void combinationSTL(vector<int> set, int n, int r) {
	for (int j = 0; j < n - r; ++j)
		set.push_back(0);
	for (int j = 0; j < r; ++j)
		set.push_back(1);
	do {
		for (int j = 0; j < n; ++j)
			if (set[j])
				printf("%d ", j);
		printf("\n");
	} while (next_permutation(set.begin(), set.end()));
}

 

재귀함수를 활용한 조합 구현

#include<iostream>
 
#define MAX 5
using namespace std;
 
int Arr[MAX];
bool Select[MAX];
 
void Print()
{
    for (int i = 0; i < MAX; i++)
    {
        if (Select[i] == true)
        {
            cout << Arr[i] << " ";
        }
    }
    cout << endl;
 
}
 
void DFS(int Idx, int Cnt)
{
    if (Cnt == 3)
    {
        Print();
        return;
    }
 
    for (int i = Idx; i < MAX; i++)
    {
        if (Select[i] == true) continue;
        Select[i] = true;

        DFS(i, Cnt + 1);
        Select[i] = false;
    }
}

2. 순열

STL함수 next_permutation을 활용한 순열 구현

/*
순열은 초기화가 필요하다.
for (int i = 0; i < n; ++i)
		set.push_back(i);
*/
void permutationSTL(vector<int> set, int n, int r) {
	do {
		for (int i = 0; i < r; ++i)
			printf("%d ", set[i]);
		printf("\n");
	} while (next_permutation(set.begin(), set.end()));
}

 

재귀함수를 활용한 순열 구현

#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;
    }
}

 

순열과 조합의 재귀 코드를 완전히 이해하는 것은 시간이 걸릴 듯 하다..

오늘은 전반적인 코드 이해로 만족해야겠다.

 

 

참고 블로그 : https://yabmoons.tistory.com/100?category=838490

 

'알고리즘 > [개념] C++' 카테고리의 다른 글

[c++] 여러개의 숫자 한줄로 받아 따로 저장하기  (0) 2020.05.08
[C++] memset  (0) 2020.01.21
[C++] Range-based for statement  (0) 2020.01.08
[C++] STL 정리  (0) 2020.01.05
[C++] vector & deque  (0) 2020.01.05
Comments