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;
}