본문 바로가기

BOJ 6603번 : 로또 본문

BOJ

BOJ 6603번 : 로또

00rigin 2020. 3. 15. 23:21

입력받은 정렬된 array 에서 원소갯수가 6개인 독립집합을 모두 구하는 문제이다.

흠.... 문제에 '모든' 이라는 단어를 보고 처음든 생각은 브루트포스 또는 DFS(깊이우선탐색) 인데, 정렬되어있는 배열에서 순차적으로 6개를 선택하면 되므로 DFS알고리즘과 좀더 가까운듯 하다.

 

입력받은 배열이 [1,2,3,4,5,6,7]일때, 6개를 순차적으로 선택하는 방법으로 아래의 그림처럼 탐색하는 것이 먼저 떠올랐다.

음...... 느낌상 윗 레벨의 숫자가 결정되면, 가능한 원소의 갯수만큼 아래 레벨에서 선택하면 될듯 하다.

 

즉, 첫 숫자로 1을 선택하게 되면, 뒤에 더 올수 있는 원소의 갯수는 5개 일것이고, 2와 3이 올수 있을 것이다.

 

1 뒤에 올 숫자로 2를 선택하면, 뒤에 올 수 있는 원소의 갯수는 4개 일 것이고, 3과4가 가능할 것이다.

 

이처럼 윗 레벨의 원소가 결정되면, 아래 레벨의 숫자를 다시 결정하는 것의 반복인데, 가장 깊은 곳 부터 탐색 할 것 이므로 recursive 한 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
#include <iostream>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<vector>
using namespace std;
vector<int> arr;
vector<int> res(6);
//DFS fuction
void cur(int level, int start, int size) {
    if (level == 6) {
        for (int i = 0; i < 6; i++)
            cout << res[i] << ' ';
        cout << endl;
        return;
    }
    else {
        for (int i = start; i< size; i++) {
            res[level] = arr[i];
            cur(level + 1, i + 1size);
        }
    }
}
 
int main() {
    int size = 0;
    while (1) {
        int tmp;
        cin >> size;
        if (!sizebreak;
        for (int i = 0; i < size; i++) {
            cin >> tmp;
            arr.push_back(tmp);
        }
        cur(00size);               //DFS
        cout << endl;
        arr.clear();
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

문제 :

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

 

'BOJ' 카테고리의 다른 글

BOJ 2869번 : 달팽이는 올라가고 싶다  (0) 2020.03.22
BOJ 10844번 : 쉬운 계단 수  (0) 2020.03.15
BOJ 1182번 : 부분수열의 합  (0) 2020.03.15
BOJ 1463번 : 1로 만들기  (0) 2020.03.15
BOJ 2579 : 계단 오르기  (0) 2020.03.15
Comments