티스토리 뷰

백준 (BOJ)/백트래킹

백준)6603-로또

플레지 2019. 4. 28. 22:28

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

문제

독일 로또는 {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,3,5,13,21],..., [3,5,8,13,21,34])

집합 S와 k가 주어졌을 때, 수를 고르는 모든 방법을 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로 주어진다.

입력의 마지막 줄에는 0이 하나 주어진다. 

출력

각 테스트 케이스마다 수를 고르는 모든 방법을 출력한다. 이때, 사전 순으로 출력한다.

각 테스트 케이스 사이에는 빈 줄을 하나 출력한다.

-----------------------------------------------------------------------------------------------------------------------------------

풀이

숫자가 오름차순으로 주어진다는 점을 이용해야 한다. DFS를 이용하여 개수를 1나씩 카운트 해주면서 cnt 값이 6이 되는순간 tmp 배열에 저장돼있는 값들을 출력 해주면 된다. 반복문 형식으로 DFS 를 이용하는 문제로 여러 문제에 서 수만 가지로 응용될 수 있으므로 꼭 잘 집고 넘어가자.

-----------------------------------------------------------------------------------------------------------------------------------

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
        #include<iostream>
        #include<cstdio>
        #include<algorithm>
        using namespace std;
            int N;
            int arr[13];
            int tmp[13];
 
        void dfs(int cur , int cnt)
        {
            int i;
            if(cnt == 6)
            {
                for( i =0 ; i<6 ; i++)
                    cout << tmp[i] << ' ' ;
                    puts("");
            }
 
 
            for(i=cur ; i<N ;i++ )
            {
                tmp[cnt] = arr[i]; 
                dfs( i+1 , cnt+1);
 
            }
 
 
        }
 
 
 
 
        int main()
        {
 
 
            while(1)
            {
                    int i,j;
 
                    cin >> N;    
 
                    if(N == 0)  return 0;
 
                    int x;
 
                    for(i=0; i<N ;i++ )
                    {
                        cin >> x;
                        arr[i] = x; 
                    }
 
                    dfs(0,0);
                    puts("");
 
 
 
 
            }
 
 
 
            return 0;
        }
 

 

'백준 (BOJ) > 백트래킹' 카테고리의 다른 글

백준)1759-암호 만들기  (0) 2019.05.01
백준)9963-N-Queen  (0) 2019.05.01
백준)1987-알파벳  (2) 2019.04.29
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함