문제 링크
접근
N개의 수 중에서 M개를 뽑아 만들 수 있는 수열을 모두 만드는 문제이다. 이때, 같은 수를 여러 번 골라도 되지만 순서는 달라야 한다.
따라서 백트래킹을 이용해 모든 경우의 수를 찾아 주었다. 그리고 사전순으로 출력해야 하기 때문에 사전에 배열을 sort 해 주었다.
코드
#include <iostream>
#include <algorithm>
using namespace std;
// N개 중에서, M개 뽑음
int N, M;
// n번째로 뽑은 수를 저장
int picked[10];
// 숫자 모음
int numbers[10];
// k 번째로 저장할 수를 탐색
void Solve(int k)
{
if (k == M)
{
for (int i = 0; i < M; i++)
cout << picked[i] << ' ';
cout << '\n';
return;
}
for (int i = 0; i < N; i++)
{
picked[k] = numbers[i];
Solve(k + 1);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> N >> M;
for (int i = 0; i < N; i++)
cin >> numbers[i];
// 사전순으로 찾기 위해 배열을 정렬
sort(numbers, numbers + N);
Solve(0);
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] Boj 15663 N과 M (9) (0) | 2025.02.03 |
---|---|
[C++] Boj 15657 N과 M (8) (0) | 2025.01.24 |
[C++] Boj 15655 N과 M (6) (1) | 2025.01.22 |
[C++] Boj 15654 N과 M (5) (0) | 2025.01.21 |
[C++] Boj 15652 N과 M (4) (0) | 2025.01.21 |