-
[BOJ] 로또Algorithm/BOJ 2020. 2. 3. 15:23
[6603] 로또
- 집합 S와 k가 주어 졌을 때, 6개의 숫자를 고르는 모든 방법을 구하는 프로그램
Solution
- 다음 순열을 사용해서 구하는 방법과 재귀를 사용해서 구하는 방법을 생각했다.
- 다음 순열을 사용할 때는 크기가 k인 a[] 배열에 공을 고르는 경우인 0을 6개, 고르지 않는 경우인 1을 k-6 개 담았다.
- 그리고 next_permutation()을 돌리면서 a[] 배열의 요소가 0인 index를 집합 S에서 찾아 출력하였다.
- StringBuffer를 사용했더니 시간이 아주 많이 줄었다.
소스코드 - 순열
import java.util.Scanner; public class Main { public void go() { Scanner sc = new Scanner(System.in); while(true) { int n = sc.nextInt(); if(n == 0) break; int[] a = new int[n]; int[] s = new int [n]; for(int i = 0; i<n;i++) { if(i > 5) a[i] = 1; s[i] = sc.nextInt(); } int[] lotto = new int[6]; do { int idx = 0; for(int i = 0; i<n;i++) { if(a[i] == 0) { lotto[idx++] = s[i]; } } print(lotto); }while(next_permutation(a, n)); System.out.println(); } } public boolean next_permutation(int[] a, int n) { int i = n - 1; while (i > 0 && a[i - 1] >= a[i]) { i -= 1; } if (i <= 0) return false; int j = n - 1; while (a[i - 1] >= a[j]) { j -= 1; } swap(a, i - 1, j); j = n - 1; while (i < j) { swap(a, i, j); i += 1; j -= 1; } return true; } public void swap(int[] a, int i, int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } public void print(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); } public static void main(String[] args) { Main main = new Main(); main.go(); } }
소스코드 - 재귀
import java.util.Scanner; public class Main { StringBuffer sb; public void go() { Scanner sc = new Scanner(System.in); while (true) { int n = sc.nextInt(); if (n == 0) break; int[] s = new int[n]; int[] lotto = new int[6]; sb = new StringBuffer(); for (int i = 0; i < n; i++) { s[i] = sc.nextInt(); } dfs(s, 0, 0, lotto); System.out.println(sb.toString()); } System.out.println(); } public void dfs(int[] s, int count, int idx, int[] lotto) { if (count == 6) { for(int i = 0; i<6; i++) { sb.append(lotto[i]+ " "); } sb.append('\n'); return; } if (idx >= s.length) { return; } lotto[count] = s[idx]; dfs(s, count + 1, idx + 1, lotto); dfs(s, count, idx + 1, lotto); } public boolean next_permutation(int[] a, int n) { int i = n - 1; while (i > 0 && a[i - 1] >= a[i]) { i -= 1; } if (i <= 0) return false; int j = n - 1; while (a[i - 1] >= a[j]) { j -= 1; } swap(a, i - 1, j); j = n - 1; while (i < j) { swap(a, i, j); i += 1; j -= 1; } return true; } public void swap(int[] a, int i, int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } public void print(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); } public static void main(String[] args) { Main main = new Main(); main.go(); } }
근데 소스코드가 왜이렇게 못생기게 나오지,, 노답이네
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 단어 수학 (0) 2020.02.04 [BOJ] 리모컨 (0) 2020.02.04 [BOJ] 외판원 순회2 (0) 2020.02.03 [BOJ] 차이를 최대로 (0) 2020.02.03 [BOJ] 다음 순열, 이전 순열 (0) 2020.02.03