본문 바로가기
알고리즘/백준

[백준 6603] 로또

by RoJae 2019. 4. 21.


 처음에 순열문제라서 간단하게 STL의 next_permutation을 사용하면 되는 줄 알았지만, 

 (수정. 사용할 수 있습니다)

 DFS나 재귀 혹은 반복을 사용하면 되는 문제였다.


간단하게 반복문을 사용하여, 풀은 문제이다.


(수정)

문제풀이 1. (재귀호출)

문제풀이 2. (next_permutation을 사용한 조합)


출처 : https://www.acmicpc.net/problem/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,3,5,13,21], ..., [3,5,8,13,21,34])

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

입력

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

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

출력

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

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



소스코드 (재귀호출)

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
#include<iostream>
#include<vector>
#include<algorithm>
 
using namespace std;
 
const int MAX = 6;
 
int n;
int arr[13];
int lotto[MAX];
 
void solve(int arr_idx, int lotto_idx){
    if(lotto_idx == MAX){
        for(int i = 0; i < MAX; i++){
            cout << lotto[i] << ' ';
        }
        cout << '\n';
        return;
    }
    else{
        for(int i = arr_idx; i < n; i++){
            lotto[lotto_idx] = arr[i];
            solve(i + 1, lotto_idx + 1);
        }
    }
}
int main(void){
    while(1){
        cin >> n;
        if(n==0)
            break;
        for(int i = 0; i < n; i++)
            cin >> arr[i];
        solve(0,0);
        cout << '\n';
    }
    return 0;
}
 
cs


소스코드 (next_permutation)

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
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
 
// 무조건 6 개씩 뽑아냄 
const int MAX = 6;
 
int n;
vector<int> list;
vector<int> idx;
 
bool desc(int a, int b){
    return a > b;
}
 
int main(void){
    while(1){
        cin >> n;
        if(n == 0)
            break;
        for(int i = 0; i < n; i++){
            int tmp;
            cin >> tmp;
            list.push_back(tmp);
        }
        
        for(int i = 0; i < 6; i++)
            idx.push_back(1);
        for(int i = 0; i < n-6; i++)
            idx.push_back(0);
    
        sort(idx.begin(), idx.end(), desc);
    
        do{
            for(int i = 0; i < n; i++){
                if(idx[i] == 1)
                    cout << list[i] << ' ';
            }
            cout << '\n';
        }while(next_permutation(idx.begin(), idx.end(), desc));
        
        cout << '\n';
        list.clear();
        idx.clear();
    }
    return 0;
}
cs


※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다.

'알고리즘 > 백준' 카테고리의 다른 글

[백준1963] 소수 경로  (0) 2019.04.23
[백준 1697] 숨바꼭질  (2) 2019.04.22
[백준 10971] 외판원 순회2  (0) 2019.04.17
[백준 10819] 차이를 최대로  (0) 2019.04.16

댓글