문제 분석
https://www.acmicpc.net/problem/15649
자연수 N과 M이 주어졌을 때, 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열을 출력하는 문제이다.
해결 방법
비어있는 리스트에 가능한 숫자를 넣어가며, 리스트의 사이즈가 M이 됐을 때를 base case로 설정하여 구현한다.
중복 없이 고른다는 조건이 있기 때문에, 이미 리스트에 포함되어 있는 숫자인지 체크하기 위한 배열을 선언해야한다.
코드
#include <iostream>
using namespace std;
int n,m;
int arr[10];
bool choice[10];
void pick(int k) {
if(k==m) {
for(int i=0;i<m;i++) {
cout << arr[i] << " ";
}
cout << "\n";
return;
}
for(int i=1;i<=n;i++) {
if(choice[i]) continue;
arr[k] = i;
choice[i] = 1;
pick(k+1);
choice[i] = 0;
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
pick(0);
}
'BOJ > 백트래킹 || 재귀' 카테고리의 다른 글
[C++] BOJ 1941 / 백트래킹 (소문난 칠공주, next_permutation 사용) (0) | 2021.08.02 |
---|---|
[C++] BOJ 9663 / 백트래킹 (N-Queen, 2차원 배열 속 대각선 계산) (0) | 2021.07.29 |
[C++] BOJ 2447 / 재귀 (별 찍기10 / Divide and Conquer) (0) | 2021.07.29 |