[백준/BOJ] 백준 15665번 : N과 M (11)

2020. 9. 17. 03:56알고리즘 문제풀이

www.acmicpc.net/problem/15665

 

15665번: N과 M (11)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

입력받은 수를 오름차순으로 정렬한 뒤, 앞에서부터 중복도 허용되도록 숫자를 골라 길이가 m인 수열을 만들어서 result에 넣는다 result는 set이므로 같은 수열이 중복돼서 추가되지 않는다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;

int n, m;
vector<int> number;
set<vector<int>> result;
set<vector<int>>::iterator it;

void Solve(vector<int>& selected)
{
	//m개를 골랐을때
	if (selected.size() == m)
	{
		//result에 넣는다. set이므로 같은 수열이 중복되서 추가되지 않는다
		result.insert(selected);

		return;
	}

	for (int i = 0; i < n; i++)
	{
		//고른 위치의 숫자는 selected에 추가
		selected.push_back(number[i]);

		Solve(selected);

		//selected에서 제거
		selected.pop_back();
	}
}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	int input;

	cin >> n >> m;

	for (int i = 0; i < n; i++)
	{
		cin >> input;
		number.push_back(input);
	}

	//입력받은 수를 오름차순으로 정렬한다
	sort(number.begin(), number.end());

	vector<int> selected;

	Solve(selected);

	//구한 수열을 출력
	for (it = result.begin(); it != result.end(); it++)
	{
		for (int i = 0; i < (*it).size(); i++)
			cout << (*it)[i] << " ";

		cout << "\n";
	}

	return 0;
}