반응형
문제
https://www.acmicpc.net/problem/6603
6603번: 로또
문제 독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다. 로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는
www.acmicpc.net
풀이
집합 S에 저장된 숫자들에 대해서 6개를 선택해서 만들 수 있는 조합을 출력하는 문제이다.
순열을 이용해서 조합을 구할 때는, 몇 개를 선택해서 조합을 이룰건지 알아야 한다. 이 때, 선택한 수들은 같은 숫자로 바꾸고 그 외 숫자들도 같은 수로 바꿔서 순열을 구하면 조합을 구할 수 있다.
예를 들어, 1 2 3 4 에서 3개를 선택해서 조합을 이루는 수를 구한다고 하면, 이 순열을 0 0 0 1로 바꾸고 0 0 0 1 에 대한 순열을 구한다. 그러면
0 0 0 1, 0 0 1 0, 0 1 0 0, 1 0 0 0
네 가지 순열이 나오게 되고 원래 데이터에서 0이 있는 자리와 매칭되는 숫자들만 선택한다고 하면 다음과 같은 조합을 구할 수 있다.
1 2 3, 1 2 4, 1 3 4, 2 3 4 가 되고 가능한 조합은 네 개가 된다.
이 점을 이용해 문제를 해결한다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#include <iostream>
#include <algorithm>
using namespace std;
int k;
int s[13];
int a[13];
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
while (true)
{
cin >> k;
if (!k) break;
for (int i=0; i<k; i++)
cin >> s[i];
for (int i=6; i<k; i++)
a[i] = 1;
do
{
for (int i=0; i<k; i++)
{
if (a[i]) continue;
cout << s[i] << ' ';
}
cout << '\n';
} while (next_permutation(a, a+k));
cout << '\n';
}
return 0;
}
|
cs |
반응형
'BOJ' 카테고리의 다른 글
백준 13398 - 연속합 2 (0) | 2020.10.07 |
---|---|
백준 8895 - 막대 배치 (0) | 2020.10.06 |
백준 10971 - 외판원 순회 2 (0) | 2020.04.26 |
백준 1939 - 중량 제한 (0) | 2020.04.18 |
백준 14499 - 주사위 굴리기 (0) | 2020.04.15 |