백준 15666번, N과 M (12)
백준 15663번 c++ 문제풀이
문제:
풀이:
- dfs를 이용하기 위해 재귀함수를 만든다.
- 중복으로 수를 고를 수 있으나 똑같은 수열을 여러개 만들 수 없다.
- 따라서 m개의 길이의 수열을 만든다고 했을 때, n번 째 숫자를 고를 때 똑같은 수를 두번 고를 수 없다.
- 주어진 숫자 중, 중복된 숫자가 있다면 제거해주면 된다.
코드:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int arr[9];
void dfs(vector<int> v, int m, int n, int count, int before){
if(count == m){ // 현재 수열이 완료가 되었다면 출력
for(int i=0;i<m;i++){
cout << arr[i] <<" ";
}
cout << "\n";
}
else{
for(int i=0;i<v.size();i++){
if(v[i] >= before && v[i-1] != v[i]){ //만든 수열에서 수가 겹치는 것은 되지만, 만든 수열 끼리는 겹치면 안됨
arr[count] = v[i];
count++;
dfs(v, m, n, count, v[i]);
count--;
}
}
}
}
int main(){
int m, n;
vector<int> v;
cin >> n >> m;
for(int i=0;i<n;i++){
int input;
cin >> input;
v.push_back(input);
}
sort(v.begin(), v.end()); //정렬시켜준다.
dfs(v, m, n, 0, 0);
}
감사합니다.
This post is licensed under CC BY 4.0 by the author.