반응형
https://www.acmicpc.net/problem/6603
[
6603번: 로또
문제 독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다. 로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는
](https://www.acmicpc.net/problem/6603)
간단한 Back tracking 문제였습니다.
-
풀이방법 : 정적 배열이용
12345678910111213141516171819202122232425262728293031323334353637//DFS 문제입니다. 거꾸로 노드를 거슬러 올라가며 탐색해야하니 백트렉킹 전문 DFS를 사용했습니다.//DFS(DFS(DFS(node,depth)))... 이런 방식인 재귀함수로 풀었습니다.#include <iostream>using namespace std;int k;int c;int s[14]; //집합int l[14]; //로또void DFS(int node,int depth){if (depth == 7) //최종 깊이까지 탐색을 했다면 로또 번호 출력함{for (int i = 1; i <= 6; i++){cout << l[i] << ' ';}cout << '\n';return;}for (int i = node; i <= k; i++)//모든 노드를 하나씩 찍으며 DFS{l[depth] = s[i];DFS(i + 1, depth + 1);}}int main() {while (cin >> k && k){for (int i = 1; i <= k; i++)cin >> s[i];DFS(1, 1);cout << '\n';}} -
풀이방법2 : vector 이용
12345678910111213141516171819202122232425262728#include <iostream>#include <vector>using namespace std;int k;vector <int> ans;vector <int> lotto;void dfs(int idx){if(ans.size()==6){for(int i = 0; i<6; i++){cout << ans[i] << ' ';}cout <<'\n';return;}for(int i = idx; i<k; i++){ans.push_back(lotto[i]);dfs(i+1);ans.pop_back();}}int main(){while(cin >> k && k!=0){lotto = vector<int>(k,0);for(int i = 0; i<k; i++) cin >> lotto[i];dfs(0);cout << '\n';}}
'Algorithm > DFS' 카테고리의 다른 글
(C++) - 백준(BOJ) 11725번 : 트리의 부모 찾기 답 (0) | 2020.09.20 |
---|---|
(C++) - 백준(BOJ) 1107번 : 리모컨 답 (0) | 2020.09.17 |
(C++) - 백준(BOJ) 2210번 : 숫자판 점프 답 (0) | 2020.02.05 |
(C++) - 백준(BOJ) 1987번 : 알파벳 답 (0) | 2020.02.04 |
(C++) - 백준(BOJ) 9663번 : N-Queen 답 (0) | 2020.02.01 |