# 생각
테스트케이스가 여러개 주어진다
--> 배열 초기화를 해줘야한다 하지만 이 문제에서는 입력이 계속 덮어쓰기 때문에 생략했다
주어진 입력에서 6개를 고르는 조합문제
--> 6일때 고른 수들을 출력해주면되고 재귀식을 탈출해주면 된다
사전 순으로 출력해야 하므로
--> 다음에 고를 수는 이전에 고른 수보다 더 커야한다
--> 시작점을 인자로 만들어 다음 수(i+1)부터 선택하게끔 만들어 준다
# 전체 코드
// 1s, 128MB
// 6 < k < 13
#include <bits/stdc++.h>
using namespace std;
int k, num[15], arr[6];
void funcRecursive(int n, int st)
{
if (n == 6)
{
for (int i = 0; i < 6; i++)
{
cout << arr[i] << ' ';
}
cout << '\n';
return;
}
for (int i = st; i < k; i++)
{
arr[n] = num[i];
funcRecursive(n + 1, i + 1);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
while (cin >> k && k != 0)
{
for (int i = 0; i < k; i++)
{
cin >> num[i];
}
funcRecursive(0, 0);
cout << '\n';
}
}
# next_permutation을 이용한 코드
#include <bits/stdc++.h>
using namespace std;
int s[13], k;
void dfs2()
{
vector<int> v;
for (int i = 0; i < k; i++)
{
v.push_back(i < 6 ? 0 : 1);
}
do
{
for (int i = 0; i < k; i++)
{
if (v[i] == 0)
{
cout << s[i] << ' ';
}
}
cout << '\n';
} while (next_permutation(v.begin(), v.end()));
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
while (cin >> k && k)
{
for (int i = 0; i < k; i++)
{
cin >> s[i];
}
dfs2();
cout << '\n';
}
}
https://www.acmicpc.net/problem/6603
6603번: 로또
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로
www.acmicpc.net
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 1941_소문난 칠공주 with cpp (0) | 2022.02.10 |
---|---|
[BOJ] 1759_암호 만들기 with cpp (0) | 2022.02.09 |
[BOJ] 15666_N과 M (12) with cpp (0) | 2022.02.08 |
[BOJ] 15665_N과 M (11) with cpp (0) | 2022.02.08 |
[BOJ] 15657_N과 M (8) with cpp (0) | 2022.02.07 |