문제 링크
풀이
N개의 수 중 M개를 뽑아 수열을 사전순 증가로 출력하는 문제이다.
이때, 수는 중복해서 뽑아도 되지만, 중복되는 수열은 만들면 안 된다.
예
N개의 수가 [1 ,7, 9(A), 9(B)]일 때.
(1, 1), (9(A), 9(A)) ------> 가능 But (9(A), 9(A))가 먼저 뽑혔으므로 (9(A), 9(B))는 불가능.
(1, 7), (7, 1) -------------> 가능
(1, 9(A)), (1, 9(B)) -----> 불가능
따라서 N과 M(9) 문제 풀이에서, 중복된 수를 허용하는 부분만 추가해 주면 되기 때문에 isUsed 배열과 조건문을 삭제하여 해결하였다.
코드
#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;
}
// 현재 depth에서 마지막으로 뽑은 숫자 저장
int tmp = 0;
for (int i = 0; i < N; i++)
{
// 1. 같은 수가 여러개 있을 경우 생기는 중복 수열을 피한다.
// 예 (1, 9(A)), (1, 9(B))
if (tmp == numbers[i]) continue;
picked[k] = numbers[i];
tmp = picked[k];
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 1759 암호 만들기 (1) | 2025.02.07 |
---|---|
[C++] Boj 15666 N과 M (12) (0) | 2025.02.06 |
[C++] Boj 15664 N과 M(10) (0) | 2025.02.04 |
[C++] Boj 15663 N과 M (9) (0) | 2025.02.03 |
[C++] Boj 15657 N과 M (8) (0) | 2025.01.24 |