본문 바로가기
알고리즘/완전 탐색

조합 - 완전 탐색

by 스빠시빠 2019. 10. 28.
조합: 일부 원소를 선택해 부분집합을 만드는 방법

 

n명의 학생들이 주어졌을 때, c명의 학생을 선택해서 만들 수 있는 모든 경우의 수를 구하시오.

 

간단한 완전 탐색 문제이다. 몇명의 학생을 선택하는지 값이 고정되어 있다면, 선택해야 하는 숫자 개수 만큼 반복문을 순회하면 완전 탐색을 할 수 있다.

 

선택해야 하는 숫자 개수가 늘어나면 늘어날수록 코드를 보기 힘들기 때문에 아래는 재귀 함수형태로 구현한 코드이다.

완전 탐색 문제는 재귀 함수를 이용하면 간단하게 작성 할 수 있다.

 

void printPicked(vector<int>& picked)
{
	for(auto it : picked)
	{
		cout << it;
	}

	cout << endl;
}

void pick(int n, vector<int>& picked, int toPick)
{
	if(toPick == 0) { printPicked(picked); return;}

	int smallest = picked.empty() ? 0 : picked.back() + 1;	

	for(int next = smallest; next < n; ++next)
	{
		picked.push_back(next);
		pick(n, picked, toPick - 1);
		picked.pop_back();
	}

}

int main()
{
	// 첫번째는 총 학생 수, 두번째는 선택 수
	int n, c;
	scanf("%d %d", &n, &c);

	vector<int> students;
	vector<int> picked;

	for(int i = 0; i <n; ++i)	
	{
		students.push_back(i);
	}

	pick(n, picked, c);

	return 0;
}

 

'알고리즘 > 완전 탐색' 카테고리의 다른 글

여행하는 외판원 문제  (0) 2019.11.01
게임판 덮기 - 완전 탐색  (0) 2019.10.31
소풍 - 완전 탐색  (0) 2019.10.28
보글게임 - 완전 탐색  (0) 2019.10.24
카펫의 크기 구하기 - 완전 탐색  (0) 2019.10.24

댓글