May 05, 2020
문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
N개의 자연수 중에서 M개를 고른 수열
같은 수를 여러 번 골라도 된다.
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 7)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.중복되는 아이템을 제거할 필요가 없기 때문에 벡터를 순회하면서 경우의 수를 모두 조합해보는 방법으로 해결했다. 방문 했던 노드는 검사하지 않아도 되고 검사해야되는 부분은 순열을 저장하는 벡터의 크기가 M과 같아질 때 이 벡터를 최종 결과를 저장하는 벡터에 계속 넣고 마지막에 정렬 후 출력해준다.
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int M;
set<vector<int> > results;
vector<int> v;
void DFS (vector<int> numbers){
if (v.size() == M){
results.insert(v);
return;
}
for (int i = 0 ; i < numbers.size() ; i++){
v.push_back(numbers[i]);
DFS(numbers);
v.pop_back();
}
}
int main (){
ios_base::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N >> M;
vector<int> numbers;
while(N--){
int item;
cin >> item;
numbers.push_back(item);
}
DFS(numbers);
for (auto r : results){
for (auto i : r){
cout << i << " ";
}
cout << "\n";
}
return 0;
}