6603번: 로또
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로
www.acmicpc.net
[문제 풀이]
조합을 이용하여 문제를 풀었습니다.
이 문제는 숫자 K와 K개의 숫자 집합이 주어졌을 때, 집합의 원소로 이루어져 있는 6개의 숫자를 뽑는 문제였습니다. N개의 숫자에서 C개의 숫자를 뽑는 것이기에 조합을 이용하여 문제를 해결했습니다.
코드 설명
- N개의 숫자를 입력받은 후 N - 6 만큼 반복문을 돌면서 6개 번호 중 첫 번째 번호를 정해 줍니다.
- combination 함수를 이용하여 나머지 다섯 개의 번호를 위와 같은 방법으로 재귀를 통해 찾아줍니다.
- 6개의 숫자가 선택되었다면 숫자를 출력해 줍니다.
[코드]
#include<iostream>
#include<vector>
using namespace std;
int N;
int six_num[6] = { 0, };
vector<int> lotto_num;
void combination(int, int);
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
while (1) {
cin >> N;
if (N == 0)
return 0;
else {
for (int i = 0; i < N; i++) {
int temp; cin >> temp;
lotto_num.push_back(temp);
}
for (int i = 0; i <= N - 6; i++) {
six_num[0] = lotto_num[i];
combination(i, 1);
six_num[0] = 0;
}
lotto_num.clear();
}
cout << endl;
}
return 0;
}
void combination(int idx, int cnt) {
if (cnt == 6) {
for (auto item : six_num)
cout << item << " ";
cout << endl;
return;
}
for (int i = idx + 1; i < N; i++) {
six_num[cnt] = lotto_num[i];
combination(i, cnt + 1);
six_num[cnt] = 0;
}
}
'algorithm > BOJ' 카테고리의 다른 글
백준 2606_바이러스(C++) (0) | 2020.10.26 |
---|---|
백준 2178_미로 탐색(C++) (0) | 2020.10.25 |
백준 16395_파스칼의 삼각형(C++) (0) | 2020.10.23 |
백준 1260_DFS와 BFS(C++) (0) | 2020.10.21 |
백준 9342_염색체(C++) (2) | 2020.10.20 |