# 생각

테스트케이스가 여러개 주어진다

--> 배열 초기화를 해줘야한다 하지만 이 문제에서는 입력이 계속 덮어쓰기 때문에 생략했다

 

주어진 입력에서 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

+ Recent posts