6603번: 로또
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로
www.acmicpc.net
49가지 수 중에서 6개를 뽑아 출력하는 문제다.
백트래킹을 이용한 조합 문제였다.
n과 m을 푼 게 도움이 됐다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void dfs(int cnt, int idx, vector<int>& ar, vector<int>& tmp, vector<bool> vis) {
if (cnt == 6) {
for (int i = 0; i < cnt; i++) {
cout << tmp[i] << ' ';
}
cout << '\n';
}
else {
for (int i = idx; i < ar.size(); i++) {
if (!vis[i]) {
vis[i] = true;
tmp[cnt] = ar[i];
dfs(cnt + 1, i, ar, tmp, vis);
vis[i] = false;
}
}
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int n;
while (1) {
cin >> n;
if (n == 0) break;
vector<int> ar(n), tmp(n);
vector<bool> vis(n, false);
for (int i = 0; i < n; i++) cin >> ar[i];
dfs(0, 0, ar, tmp, vis);
cout << '\n';
}
return 0;
}
처음에는 next_permutation으로 하려 했으나 조합은 어떻게 구해야 하는지 몰라서 dfs로 직접 구현했다..
for (int i = idx; i < ar.size(); i++) {
if (!vis[i]) {
vis[i] = true;
tmp[cnt] = ar[i];
dfs(cnt + 1, i, ar, tmp, vis);
vis[i] = false;
}
}
순열을 뽑는 경우와 달리 조합을 만들려면 int i = 0 이 아니라 idx를 함수 인자로 넣어줘서 같이 올려줘야 조합이 만들어진다.
'BOJ' 카테고리의 다른 글
BOJ 11000 강의실 배정 (0) | 2020.10.02 |
---|---|
BOJ 2437 저울 (0) | 2020.10.02 |
BOJ 1644 소수의 연속합 (0) | 2020.09.23 |
BOJ 2096 내려가기 (0) | 2020.09.23 |
BOJ 2015 수들의 합 4 (0) | 2020.09.23 |