이번 문제는 백트레킹 알고리즘을 활용하여 해결하였다. 문제의 조건없이 출력하는 것은 쉽지만 같은 수를 여러 번 골라도 되지만 길이M의 수열끼리는 중복을 허용하지 않는다는 조건에서 생각이 필요했다.
#include <iostream>
#include <algorithm>
#include <vector>
#define MAX 8
using namespace std;
int n, m, a;
vector<int> arr;
int result[MAX];
bool num_chk[10001];
void Input(){
cin>>n>>m;
for(int i=0; i<n; i++){
cin>>a;
if(!num_chk[a]){
arr.push_back(a);
num_chk[a]=true;
}
}
sort(arr.begin(), arr.end());
}
void DFS(int cnt){
if(cnt==m){
for(int i=0; i<m; i++){
cout<<result[i]<<" ";
}
cout<<"\n";
return;
}
for(int i=0; i<arr.size(); i++){
result[cnt]=arr[i];
DFS(cnt+1);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Input();
DFS(0);
return 0;
}
처음에는 DFS 안에서 중복을 제거하려다가 시간초과가 발생하였고, 이를 입력 과정에서 제거하는 방식으로 변경하여 시간을 단축시켰다.