본문 바로가기
Algorithm/백준

[백준] 6603번 로또 (자바)

by 코딩로그 2022. 8. 9.

 

  • 접근 방법
    • 처음에는 그냥 재귀로 탐색하여 풀었으나 순서만 다른 같은 로또 번호 배열이 출력되었습니다.
    • 따라서, 조합이라는 방법을 생각했습니다
    • 조합 : n개의 원소 중에서 r개를 순서 없이 뽑는 경우의 수를 의미합니다.

조합의 수식

 

package com.algorithm.boj.recursive;

import java.util.Scanner;

/*
 * 문제 : 백준 6603번 로또
 * 접근 유형 : 재귀, 조합
 * 1. 로또 번호의 순서와 상관없이 선택해야하므로->조합
 * */
public class Main_6603 {
	
	static int k;
	static boolean[] check;
	static int[] lotto;
	static int[] temp = new int[6];
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while(true) {
			k = sc.nextInt();//로또 개수
			if(k == 0) {
				break;
			}
			lotto = new int[k];
			check = new boolean[k];
			for(int i = 0; i < k; i++) {
				lotto[i] = sc.nextInt();
			}
			chooseLotto(0, k, 6);
			System.out.println();
			
		}
	
		
		sc.close();
	}
	
	
	
	/**
	 * @param count 배열의 길이
	 * @param k
	 * @param r 뽑아야하는 개수
	 */
	private static void chooseLotto(int count, int k, int r) {
		//탈출 조건 : 6개의 수를 전부 고른 경우
		if(r == 0) {
			print();
			return;
		}
		//배열의 길이까지 돈 경우
		if(count == k) {
			return;
		}
		
		//현재 번호를 뽑은 경우
		check[count] = true;
		chooseLotto(count+1, k, r-1);
		
		//현재 번호를 뽑지 않은 경우
		check[count] = false;
		chooseLotto(count+1, k, r);
		
		return;
	}
	
	private static void print() {
		for(int i = 0; i < k; i++) {
			if(check[i]) {
				System.out.print(lotto[i] + " ");
			}
		}
		System.out.println();
	}
	
}