
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
백트래킹
- N과 M (1)에서 조금 업그레이드 된 문제이다. 쉽게 말하면 주어진 N개의 자연수로 순열을 만들면 되는 문제이다.
- 이 때 가장 중요한 부분은 중복을 허용하지 않으므로 visited[] 배열을 사용해서 방문처리를 해줘야한다.
//boj15654번_N과 M (5)_백트래킹
#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) {
if (v == M) {
for (int i = 0; i < M; i++) {
cout << arr[i] << " ";
}
cout << '\n';
return;
}
for (int i = 0; i < N; i++) {
if (!visited[i]) {
visited[i] = true;
arr[v] = result[i];
DFS(v + 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);
return 0;
}