문제 링크
접근
N개의 숫자 중에서 M개를 뽑아 수열을 만든다. 이때 중복해서 뽑아도 되지만 뽑은 수열이 내림차순이 되어서는 안 된다.
내림차순이 되어선 안된다는 조건만이 N과 M (3) 문제에서 추가됐을 뿐이어서 N과 M (3) 문제 풀이에서 비내림차순 조건을 추가하여 풀었다.
코드
#include <iostream>
using namespace std;
// N개 중에서, M개 뽑음
int N, M;
// n번째로 뽑은 수를 저장
int numbers[10];
// k 번째로 저장할 수를 탐색
void Solve(int k)
{
if (k == M)
{
for (int i = 0; i < M; i++)
cout << numbers[i] << ' ';
cout << '\n';
return;
}
for (int i = 0; i < N; i++)
{
// 전에 뽑았던 숫자가 지금 뽑은 숫자보다 크면
// 내림차순이기 때문에 패스
if (k > 0 && numbers[k - 1] > i + 1) continue;
numbers[k] = i + 1;
Solve(k + 1);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> N >> M;
Solve(0);
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] Boj 15655 N과 M (6) (1) | 2025.01.22 |
---|---|
[C++] Boj 15654 N과 M (5) (0) | 2025.01.21 |
[C++] Boj 15651 N과 M (3) (0) | 2025.01.21 |
[C++] Boj 15650 N과 M (2) (0) | 2025.01.20 |
[C++] Boj 1182 부분수열의 합 (0) | 2025.01.17 |