❌6603-로또

  • 1~49 중 숫자 6개를 고름

  • 로또 번호 선택하는 전략 중 49개 숫자에서 k(k>6)개의 숫자를 골라 집합 S를 만듬

  • 그 집합 S만 가지고 번호 선택

k=8, S={1,2,3,5,8,13,21,34}일 때

  • 1,2,3,5,8,13

  • 1,2,3,5,8,21

이런식으로 오름차순으로 된 모든 집합 S를 출력하라

남이 푼거

선택할 수 있는 모든 경우의 수를 오름차순으로 출력하면 된다. 일단 선택할 수 있는 모든 경우의 수에서 브루트포스라는 것을 알 수 있다.

S에서 각 원소를 시작점으로 하여 dfs를 수행하면 모든 경우의 수를 구할 수 있음

  • dfs는 현재 정점에서 이동할 수 있는 정점을 인접행렬 혹은 인접리스트로 하는데

    • 여기서는 그냥 현재 인덱스보다 큰 인덱스로 이동하면된다.

    • 그래서 visited가 필요없다. 방문했던 인덱스를 또 방문할 일이 없기 때문이다.

int size, numList[49];
int visited[49];
vector <int> visitedPath;
const int PICK_NUM = 6;

void dfs(int start, int count) {
    if(count >= 6) {
        for(int i = 0; i<count; i++) {
            cout<<visitedPath[i]<<" ";
        }
        cout<<endl;
        return;
    } else {
        for(int i = start + 1; i<size; i++) {
            if(!visited[i]) {
//                visited[i] = true;
                visitedPath.push_back(numList[i]);
                count += 1;
                dfs(i, count);
                visitedPath.pop_back();
                count -= 1;
            }
        }
    }
//    for(int i = start + 1; i < size; i+=1) {
//        visited[i] = false;
//    }
}

int main() {
    cin>>size;
    for(int i = 0; i<size; i+=1) {
        cin>>numList[i];
    }

    while(size != 0) {
        for(int i = 0; i<=size-PICK_NUM; i+=1) {
            visitedPath.push_back(numList[i]);
            dfs(i, 1);
            visitedPath.pop_back();
        }
        cout<<endl;
        cin>>size;
        for(int i = 0; i<size; i+=1) {
            cin>>numList[i];
        }
    }

    return 0;
}

Last updated

Was this helpful?