-
[백준 6603] 로또알고리즘/백준 2019. 4. 21. 20:57
처음에 순열문제라서 간단하게
STL의 next_permutation을 사용하면 되는 줄 알았지만,(수정. 사용할 수 있습니다)
DFS나 재귀 혹은 반복을 사용하면 되는 문제였다.
간단하게 반복문을 사용하여, 풀은 문제이다.
(수정)
문제풀이 1. (재귀호출)
문제풀이 2. (next_permutation을 사용한 조합)
출처 : https://www.acmicpc.net/problem/6603
문제
독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다.
로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 것이다.
예를 들어, k=8, S={1,2,3,5,8,13,21,34}인 경우 이 집합 S에서 수를 고를 수 있는 경우의 수는 총 28가지이다. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ..., [3,5,8,13,21,34])
집합 S와 k가 주어졌을 때, 수를 고르는 모든 방법을 구하는 프로그램을 작성하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로 주어진다.
입력의 마지막 줄에는 0이 하나 주어진다.
출력
각 테스트 케이스마다 수를 고르는 모든 방법을 출력한다. 이때, 사전 순으로 출력한다.
각 테스트 케이스 사이에는 빈 줄을 하나 출력한다.
소스코드 (재귀호출)
12345678910111213141516171819202122232425262728293031323334353637383940#include<iostream>#include<vector>#include<algorithm>using namespace std;const int MAX = 6;int n;int arr[13];int lotto[MAX];void solve(int arr_idx, int lotto_idx){if(lotto_idx == MAX){for(int i = 0; i < MAX; i++){cout << lotto[i] << ' ';}cout << '\n';return;}else{for(int i = arr_idx; i < n; i++){lotto[lotto_idx] = arr[i];solve(i + 1, lotto_idx + 1);}}}int main(void){while(1){cin >> n;if(n==0)break;for(int i = 0; i < n; i++)cin >> arr[i];solve(0,0);cout << '\n';}return 0;}cs 소스코드 (next_permutation)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include<iostream>#include<vector>#include<algorithm>#include<cstring>using namespace std;// 무조건 6 개씩 뽑아냄const int MAX = 6;int n;vector<int> list;vector<int> idx;bool desc(int a, int b){return a > b;}int main(void){while(1){cin >> n;if(n == 0)break;for(int i = 0; i < n; i++){int tmp;cin >> tmp;list.push_back(tmp);}for(int i = 0; i < 6; i++)idx.push_back(1);for(int i = 0; i < n-6; i++)idx.push_back(0);sort(idx.begin(), idx.end(), desc);do{for(int i = 0; i < n; i++){if(idx[i] == 1)cout << list[i] << ' ';}cout << '\n';}while(next_permutation(idx.begin(), idx.end(), desc));cout << '\n';list.clear();idx.clear();}return 0;}cs ※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다.
반응형'알고리즘 > 백준' 카테고리의 다른 글
[백준1963] 소수 경로 (0) 2019.04.23 [백준 1697] 숨바꼭질 (2) 2019.04.22 [백준 10971] 외판원 순회2 (0) 2019.04.17 [백준 10819] 차이를 최대로 (0) 2019.04.16