코딩테스트/Baekjoon

[백준 #6603] 로또 (C++)

동띵 2021. 9. 9. 10:03

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

6603번: 로또

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

www.acmicpc.net


k개의 수만큼 수를 입력하여 벡터 v에 넣어주었다.
그다음 k개 중 6개를 출력하기 위해
벡터 tmp에 k개의 수 중 6개에 1을, 나머지 (k-6) 는 0을 넣어주었다.
(만약 k가 7이라면 tmp는 {1, 1, 1, 1, 1, 1, 0}이 되는 것이다)

그다음 do-while 문을 이용해 tmp 현재에 이전 순열이 있으면
for 문을 실행하여 tmp의 i번째 요소가 1일 경우,
벡터 v의 i번째 요소가 출력되도록 했다.

***
v = {1, 2, 3, 4, 5, 6, 7}이라고 가정하면, 처음 tmp = {1, 1, 1, 1, 1, 1, 0}이 되고,
for 문을 실행하면 1, 2, 3, 4, 5, 6이 출력된다.
(do-while이라 처음은 검사 X)

그리고 tmp에 이전 순열이 {1, 1, 1, 1, 1, 0, 1}로 존재하기 때문에
for 문을 실행하면 1, 2, 3, 4, 5, 7이 출력된다.
.
.
.
이런 식으로 반복하다 보면 k개 중 6개를 뽑아서
만들 수 있는 순열이 모두 출력되게 된다.

#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); int k, s, idx = 6; while (true) { vector <int> v; vector <int> tmp; cin >> k; if (k == 0) break; else { for (int i = 0; i < k; i++) { cin >> s; v.push_back(s); } for (int i = 0; i < idx; i++) { tmp.push_back(1); } for (int i = 0; i < k - idx; i++) { tmp.push_back(0); } do { for (int i = 0; i < tmp.size(); i++) { if (tmp[i] == 1) { cout << v[i] << " "; } } cout << "\n"; } while (prev_permutation(tmp.begin(), tmp.end())); cout << "\n"; } } return 0; }