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

 

6603번: 로또

문제 독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다. 로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 것이다. 예를 들어, k=8, S={1,2,3,5,8,13,21,34}인 경우 이 집합 S에서 수를 고를 수 있는 경우의 수는 총 28가지이다. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2

www.acmicpc.net

 

K개 중 6개를 고르는 문제이다. 고르는 개수가 정해져 있기 때문에 넥퍼뮤를 사용해도 좋지만 조합을 이용해서 구했다.

 

먼저 k개만큼 배열에 입력받고, 이 배열에서 6개를 고르는 모든 경우를 구해준다.

숫자를 고를때마다 lotto 벡터에 넣어주고 6개의 숫자를 고른 경우 lotto 벡터에 있는 값들을 모두 출력해주고 return

k개의 숫자를 사용할지 안 할지 모두 정한 경우(index 가 k를 넘어간 경우)에도 더 이상 고를 숫자가 없으므로 return 해준다.

 

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
int k;
int num[12];
 
void solve(int index, int select, vector<int> &lotto) {
    //고를 수의 범위가 넘어감
    if(index > k) {
        return;
    }
 
    //6개를 모두 골랐다
    if(select == 6) {
 
        //고른 숫자들을 모두 출력해준다.
        for(int i=0; i<6; i++) {
            cout << lotto[i] << ' ';
        }
        cout << '\n';
        return;
    }
 
 
    //현재 index번째 숫자를 고른 경우를 탐색.
    //하나를 골랐으므로 select 값을 1 증가시킨다.
    lotto.push_back(num[index]);
    solve(index+1, select+1, lotto);
 
    //다시 빼주고 고르지 않는 경우를 탐색
    lotto.pop_back();
    solve(index+1, select, lotto);
 
}
 
 
int main() {
 
    while(true) {
        cin >> k;
        if(k == 0break;
 
        for(int i=0; i<k; i++) {
           int x;
           cin >> x;
           num[i] = x;
        }
 
        vector<int> lotto;
        solve(0,0,lotto);
        cout << '\n';
    
    }
 
    return 0;
}
Colored by Color Scripter
 

 

'BOJ' 카테고리의 다른 글

[BOJ] 2667. 단지번호붙이기  (0) 2019.06.25
[BOJ] 14888. 연산자 끼워넣기  (0) 2019.06.20
[BOJ] 10971. 외판원 순회2 (DFS 풀이)  (0) 2019.06.20
[BOJ] 10971. 외판원 순회2  (0) 2019.06.20
[BOJ] 10974. 모든 순열  (0) 2019.06.20

+ Recent posts