처음에 순열문제라서 간단하게 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이 하나 주어진다.
출력
각 테스트 케이스마다 수를 고르는 모든 방법을 출력한다. 이때, 사전 순으로 출력한다.
각 테스트 케이스 사이에는 빈 줄을 하나 출력한다.
소스코드 (재귀호출)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #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 |
댓글