[백준/BOJ] 백준 6603번 : 로또

2020. 6. 4. 17:22알고리즘 문제풀이

https://www.acmicpc.net/problem/6603

 

6603번: 로또

문제 독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다. 로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는

www.acmicpc.net

k개중 6개를 사전 순으로 선택해 모든 방법을 출력한다.

k개중 6개를 선택하는 방법은 check라는 벡터에 0을 6개, 1을 k-6개를 넣어 모든 순열을 생성하였다.

그리고 각 순열 하나마다 0이 어떤 위치에 있는지를 파악하여 해당 위치에 있는 input원소를 출력하였다.

 

코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	int k;
	vector<int> input;
	int temp;

	while (1)
	{
		cin >> k;

		if (k == 0)
			break;

		input.clear();
		
		//k개를 입력받는다.
		for (int i = 0; i < k; i++)
		{
			cin >> temp;
			input.push_back(temp);
		}

		//선택할 6개의 0을 넣고 나머지(k-6개)의 1을 넣어
		//순열을 만들고 그 중 0이 있는 위치 i를 구해, input[i]로 이루어진 조합으로 6개를 선택한다.	
		vector<int> check(6, 0);
		
		for (int i = 0; i < k - 6; i++)
		{
			check.push_back(1);
		}

		sort(check.begin(), check.end());

		do {

			for (int i = 0; i < k; i++)
			{
				if (check[i] == 0)
					cout << input[i] << " ";
			}
			cout << "\n";

		} while (next_permutation(check.begin(), check.end()));//순열을 만든다.

		cout << "\n";
	}

	return 0;
}