본문 바로가기

알고리즘 문제풀이

[백준 6603] 로또 - c++

문제링크: 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


문제설명

원소의 수가 6 이상인 숫자 집합 S에서 6자리 숫자 조합을 만들어 오름차순으로 출력하는 문제 

 

소스코드

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <vector>
#include <cstdlib>
 
using namespace std;
 
// 로또 자리수
int length = 6;
 
// 반복횟수를 줄이기 위한 변수
int limit = 0;
 
// 입력 후보숫자를 받는 배열
vector<int> s;
 
 
// 정답 출력 함수
void printVector(vector<int> vct){
    for(int i=0; i<vct.size(); i++){
        cout << vct[i] <<" ";
    }
    cout << endl;
}
 
 
void dfs(int idx, vector<int> candidate){
    
    // 깊이가 로또 자리수가 되면 저장한 로또 번호 출력
    if(idx == length){
        printVector(candidate);
        return;
    }
    
    // 오름차순 조건에 맞는 범위를 반복하며 dfs 재귀호출
    for(int i=idx; i<limit+idx; i++){
        if(candidate.back() < s[i]){
            candidate.push_back(s[i]);
            dfs(idx+1, candidate);
            candidate.pop_back();
        }
    }
    
    
}
 
int main(){
    freopen("input.txt","r",stdin);
    int k;
    
    
    while(cin >> k){
        s.clear();
        
        int temp;
        for(int i=0; i< k; i++){
            cin >> temp;
            s.push_back(temp);
        }
        
        // 로또번호 후보를 저장하는 벡터
        vector<int> candidate;
        
        // 조건 오름차순에 맞게 반복문의 범위를 설정
        limit = s.size()-length+1;
        
        // 첫번재 자리수에 들어갈 수 있는 범위만큼 반복하며 dfs 호출
        for(int i=0; i< limit; i++){
            candidate.clear();
            candidate.push_back(s[i]);
            dfs(1, candidate);
            candidate.pop_back();
        }
        cout << endl;
        
    }
    return 0;
}
 
 
cs