ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    댓글

Designed by Tistory.