ALG/ALG Solve

C++) 백준 6603번 - 로또

jh2ee 2023. 1. 29. 00:52

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

 

6603번: 로또

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

www.acmicpc.net

n과 m 문제들과 유사한 방법으로 풀이한다.

차이점은 출력할 원소의 개수가 고정되어 있고 여러개의 케이스가 주어진다는 점이다.

do-while문을 통해 매 케이스 마다 가능한 경우의 수를 모두 출력하도록 했다.

#include <bits/stdc++.h>
using namespace std;

int k;
int arr[52];
int ans[52];
bool check[52];

void func(int n){
    if(n==6){ //6개 원소 출력
        for(int i=0;i<6;i++){
            cout<<ans[i]<<" ";
        }
        cout<<"\n";
        return; //return하지 않을 경우 bus error 발생
    }
    for(int i=0;i<k;i++){ //k개의 입력 존재, k회 반복
        if(n!=0&&ans[n-1]>arr[i]) continue; //사전 순서 처리 위함
        if(check[arr[i]]) continue; //같은 수 중복 사용 방지
        ans[n]=arr[i];
        check[arr[i]]=1;
        func(n+1);
        check[arr[i]]=0;
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    do{ //0이 입력되기 전까지 반복
        cin>>k;
        for(int i=0;i<k;i++){
            cin>>arr[i];
        }
        func(0);
        cout<<"\n";
    }while(k!=0); //각 케이스에 첫번째로 주어지는 입력은 k이므로

    return 0;
}