PS(Problem Solving)/백준(BOJ)

[백준][6603번][C++] 로또

seongmik 2020. 11. 15. 17:42
728x90
반응형

https://www.acmicpc.net/problem/6603

 

6603번: 로또

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

www.acmicpc.net

독일 로또에서 로또번호를 뽑는 경우의 수를 모두 출력하는 문제이다.

 

알고스팟에 PICNIC 문제와 비슷한 함수를 구현해서 풀어보았다.

 

다른점이 있다면 이 문제는 테스트 케이스가 여러개가 주어지기 때문에 테케마다 원본 벡터를 초기화 해야하기 때문에 매 테스트 케이스마다 벡터를 새로 선언해서 원소를 넣어주고 solve함수에 인자로 주었다.

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;
int taken[60]={0,};

void solve(int K, int now, vector<int>& arr, vector<int>& picked, int topick)
{
    if(topick==0)
    {
        for(int i=0;i<6;i++)
            printf("%d ",picked[i]);
        printf("\n");
        return;
    }
    for(int i=now;i<K;i++)
    {
        if(taken[i]==0)
        {
            taken[i]=1;
            picked.push_back(arr[i]);
            solve(K,i+1,arr,picked,topick-1);
            taken[i]=0;
            picked.pop_back();
        }
    }
    return;
}

int main()
{
    int K=1;
    while(K!=0)
    {
        scanf("%d",&K);
        if(K==0)
            break;
        
        for(int i=0;i<60;i++)
            taken[i]=0;
        int num;
        vector<int> arr, picked;
        for(int i=0;i<K;i++)
        {
            scanf("%d",&num);
            arr.push_back(num);
        }
        solve(K,0,arr,picked,6);
        printf("\n");
    }
    
    return 0;
}
728x90
반응형