BOJ_단계별로 풀어보기(9단계~)/[13단계] 백트래킹
[백준 15651] N과 M (3)
pushback
2022. 3. 11. 16:37
중복을 신경쓰지 않기 때문에, 재귀함수 내 for문은 1부터 N까지 돌자. 재귀함수를 M번 호출하면 끝.
참고로, 답을 int형 배열이 아닌 string에 저장하면 입출력 속도가 월등히 빨라진다.
1. int형 배열에 답 저장
#include <bits/stdc++.h>
using namespace std;
int N, M;
int ans[9];
void recur(int cnt) {
if (cnt == M) {
for (int i = 0; i < M; ++i) cout << ans[i] << ' ';
cout << '\n';
return;
}
for (int cur = 1; cur <= N; ++cur) {
ans[cnt] = cur;
recur(cnt + 1);
}
}
int main() {
ios::ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> N >> M;
recur(0);
return 0;
}
2. string에 답 저장
#include <bits/stdc++.h>
using namespace std;
int N, M;
string ans;
void recur(int cnt) {
if (cnt == M) {
ans.back() = '\n';
cout << ans;
return;
}
for (int cur = 1; cur <= N; ++cur) {
ans.push_back(cur + '0');
ans.push_back(' ');
recur(cnt + 1);
ans.pop_back();
ans.pop_back();
}
}
int main() {
ios::ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> N >> M;
recur(0);
return 0;
}