https://www.acmicpc.net/problem/6603
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
www.acmicpc.net
문제 풀이
1. result[] 배열을 통해 경우의 수를 구한다.
2. 모든 수중에 1의 개수가 원하는 개수일 때 출력한다.
3. 개수를 체크하는 방법은 비트연산에서는 count 변수를 사용
4. 출력시에 result[] 배열이 1인 부분만 출력하되 출력은 arr[] 배열을 출력한다.
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.util.Arrays;
class Main {
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String[] str = br.readLine().split(" ");
int N = Integer.parseInt(str[0]);
int[] arr = new int[N];
int[] result = new int[N];
if (N == 0) {
break;
}
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(str[i + 1]);
}
for (int i = (1<<N)-1; i >=0; i--) {
Arrays.fill(result, 0);
int count = 0;
int bit = i;
for (int j = 0; bit != 0; j++, bit >>= 1) {
if ((1 & bit) == 0) {
continue;
}
// 사전순 정렬을 해야하기 때문에 반대로 출력해줘야한다.
result[Math.abs((N-1)-j)] = 1;
count++;
}
if (count == 6) {
for (int k = 0; k <N; k++) {
if(result[k]==1)
System.out.print(arr[k] + " ");
}
System.out.println();
}
}
System.out.println();
}
}
}
'JAVA 알고리즘 ' 카테고리의 다른 글
백준 15686번 - 치킨 배달 (0) | 2019.11.03 |
---|---|
백준 2661번 - 좋은수열 (0) | 2019.11.02 |
백준 11651번 - 좌표정렬하기2 (0) | 2019.10.29 |
백준 11650번 - 좌표정렬하기 (0) | 2019.10.29 |
백준 1026번 - 보물 (0) | 2019.10.29 |