https://www.acmicpc.net/problem/6603
6603번: 로또
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로
www.acmicpc.net
행운의 숫자를 K(K>6)개 고른 후, 그 중에서 6개의 숫자를 고르는 문제다.
bitset이 깔끔할 것이라 생각했지만, 오늘은 재귀 공부하는 날이다.
숫자를 하나씩 추가하거나 제거하면서 조합을 만든다.
bool visited 배열을 통해 특정 숫자의 포함 여부를 판단할 수 있다.
#include <iostream>
using namespace std;
#include <vector>
bool visited[50]; // 방문 구분
void recur(int idx, int depth, const vector<int>& v){
if(depth == 6){
for(int i=1; i < 50; i++){
if(visited[i]) cout << i <<' ';
}cout <<'\n';
}else{
for(int i= idx+1; i<v.size(); i++){
int now = v[i];
if(visited[now]) continue;
visited[now] = true;
recur(i, depth+1, v);
visited[now] = false;
}
}
}
int main(){
while(1){
int N; cin >> N;
if(N == 0) break;
//
//visited 초기화
for(int i=0; i < 50; i++) visited[i] = false;
//행운의 숫자 선택
vector<int>v(N);
for(int i=0; i < N; i++) cin >> v[i];
//숫자모음 고고
recur(-1, 0, v);
//
cout <<'\n';
}
return 0;
}
recur 함수에서 특정 숫자의 포함 여부를 판단하는 과정에서 1부터 49까지 전부 조사한다.
vector는 stack처럼 이용할 수 있으며(push_back, pop_back) + 인덱스로 데이터 접근이 가능하다(O(1)).
#include <iostream>
using namespace std;
#include <vector>
vector<int> visit;
void recur(int idx, int depth, const vector<int>& v){
if(depth == 6){
for(auto i : visit){
cout << i << ' ';
}cout <<'\n';
}else{
for(int i= idx+1; i<v.size(); i++){
int now = v[i];
visit.push_back(now);
recur(i, depth+1, v);
visit.pop_back();
}
}
}
int main(){
while(1){
int N; cin >> N;
if(N == 0) break;
//
//행운의 숫자 선택
vector<int>v(N);
for(int i=0; i < N; i++) cin >> v[i];
//숫자모음 고고
recur(-1, 0, v);
//
cout <<'\n';
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 11899 괄호 끼워넣기 (0) | 2021.12.23 |
---|---|
백준 3986 좋은 단어 (0) | 2021.12.23 |
백준 18511 큰 수 구성하기 (0) | 2021.12.22 |
백준 17478 재귀함수가 뭔가요? (0) | 2021.12.22 |
백준 5568 카드 놓기 (0) | 2021.12.22 |