
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
- 고른 수열은 오름차순이어야 한다.
백트래킹
- 주어진 N개의 자연수로 오름차순인 순열을 만들면 되는 문제이다.
- 수열이 오름차순이어야 하므로 DFS의 인자로 현재 선택한 수보다 1큰 수를 넘겨주고, 넘겨받은 수 부터 DFS를 도는 것이 핵심이다.
//boj15655번_N과 M (6)_백트래킹
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int arr[9];
int result[9];
bool visited[9];
int N, M;
void DFS(int v, int num) {
if (v == M) {
for (int i = 0; i < M; i++) {
cout << arr[i] << " ";
}
cout << '\n';
return;
}
for (int i = num; i <= N; i++) {
if (!visited[i]) {
visited[i] = true;
arr[v] = result[i - 1];
DFS(v + 1, i + 1);
visited[i] = false;
}
}
}
int main() {
cin >> N >> M;
for (int i = 0; i < N; i++) {
cin >> result[i];
}
sort(result, result + N);
DFS(0, 1);
}