[6603] 로또
Next-Permutation 풀이
1 2 3 5 8 13 21 34이 주어지는 경우, 앞에서부터 1개를 1로 두어 11111100을 만들고 이를 std::prev_permutation을 돌리면서 1의 위치에 있는 값들을 출력한다. 이는 첫번째로 주어지는 숫자 k가 13미만의 작은 수이기 때문에 가능하다.
Next-permutation 코드
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int main(void) {
vector<int> v, np;
int n = 0, t=0;
while (true) {
scanf("%d", &n);
if (n == 0) break;
for (int i = 0; i < n; i++) {
scanf("%d", &t);
v.push_back(t);
if (i < 6) np.push_back(1);
else np.push_back(0);
}
do{
for (int i = 0; i < np.size(); i++) {
if (np[i] == 1) {
printf("%d ", v[i]);
}
}
printf("\n");
} while (prev_permutation(np.begin(), np.end()));
printf("\n");
v = vector<int>();
np = vector<int>();
}
return 0;
}
백트래킹 풀이
void go(int len, vector
- len : 몇 개의 값을 선택해야하는가?
- all : 선택가능한 모든 값을 넣어둔 벡터
- sel : all에서 현재까지 선택된
- idx : all에서 idx번째 값을 넣을지 말지 결정
백트래킹의 dfs 개념은 all의 모든 원소를 하나씩 붙혀나간다는 개념으로 변형되었습니다. 그리고 pruning은 sel의 길이가 6이 아니여도 idx를 더이상 늘려갈 수 없을 때 return;를 하는 것으로 적용되었습니다.
백트래킹 코드
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
/*
1. len : 몇 개의 값을 선택해야하는가?
2. all : 선택가능한 모든 값을 넣어둔 벡터
3. sel : all에서 현재까지 선택된
4. idx : all에서 idx번째 값을 넣을지 말지 결정
*/
void go(int len, vector<int> all, vector<int> sel, int idx) {
if (sel.size() == len) {
for (int i = 0; i < sel.size(); i++) {
printf("%d ", sel[i]);
}
printf("\n");
return;
}
if (idx >= all.size()) return;
sel.push_back(all[idx]);
go(len, all, sel, idx + 1);
sel.pop_back();
go(len, all, sel, idx + 1);
}
int main(void) {
vector<int> all, selected;
int n = 0, t=0;
while (true) {
scanf("%d", &n);
if (n == 0) break;
for (int i = 0; i < n; i++) {
scanf("%d", &t);
all.push_back(t);
}
go(6, all, selected, 0);
printf("\n");
all = vector<int>();
selected = vector<int>();
}
return 0;
}