Algorithm/BOJ

[BOJ] 로또

goakgoak 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();
	}
}

 

근데 소스코드가 왜이렇게 못생기게 나오지,, 노답이네