▶문제설명
[BOJ] 백준 15649. N과 M (1)
▶ 설계
[문제]
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
무식하게 모든 경우를 다 해보면 되는 문제입니다. (브루트 포스)
이런 식의 문제는 재귀로 구현하면 편합니다.
1 ~ n의 수 중에 아직 사용되지 않은 수를 벡터에 push_back 하면서 가능한 경우를 모두 탐색합니다.
사용된 수를 체크하기 위해 1차원 bool 배열을 사용합니다.
벡터의 사이즈가 M이 되면 M개의 수를 선택한 것이 되므로 수열을 출력합니다.
재귀호출 전에 true, 호출 후에 false로 바꾸어주는 패턴은 브루트 포스 문제에서 늘 나오는 패턴이므로 몸에 익히는 게 좋습니다.
▶ 구현
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 | #include<iostream> #include<vector> using namespace std; bool check[9]; void dfs(int N, int M, vector<int>& vt){ if(vt.size() == M){ for(int i: vt) cout<<i<<" "; cout<<"\n"; return; } for(int n=1; n<=N; n++){ if(check[n])continue; vt.push_back(n); check[n] = true; dfs(N,M,vt); vt.pop_back(); check[n] = false; } } int main(){ int N,M; vector<int> vt; cin>>N>>M; dfs(N,M,vt); return 0; } | cs |
▶ 결과
'■ 알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
[BOJ] 백준 15651. N과 M (3) (0) | 2020.04.24 |
---|---|
[BOJ] 백준 15650. N과 M (2) (0) | 2020.04.24 |
[BOJ] 백준 1074. Z (0) | 2020.01.25 |
[BOJ] 백준 2447. 별 찍기 - 10 (0) | 2020.01.23 |
[BOJ] 백준 1654. 랜선 자르기 (0) | 2019.12.29 |