백준 6603 - 로또 (java)

J·2022년 10월 3일
0

알고리즘 문제풀이

목록 보기
16/21
post-custom-banner

문제 정리


오름차순으로 주어진 숫자 집합에서 6개의 숫자를 골라 조합을 만드는 문제다

입력

각 테스트 케이스는 한 줄에 하나씩
테스트 케이스의 숫자중 맨 첫 숫자는 집합 원소의 수
그 다음 숫자는 모두 집합의 원소
입력의 마지막 줄은 0

출력

각 테스트 별로 한 줄에 하나씩 숫자를 고를 수 있는 경우를 출력
테스트 케이스 간의 출력은 빈 줄 하나 출력

idea 정리


테스트케이스가 여러가지인 조합 문제다
종료 조건만 잘 정리해주면 된다

알고리즘 구성


  1. 입력값 저장
  2. 조합
    -> 하나의 조합을 완성한 경우 string builder에 저장
  3. 입력값이 끝날때까지 1~2 반복

구현


//로또
public class Main {
	static int K;
	static int[] arr;
	static int[] selected;
	static StringBuilder sb;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		sb = new StringBuilder();
		
		String input = br.readLine();
		while(true) {
			StringTokenizer st = new StringTokenizer(input, " ");

			K = Integer.parseInt(st.nextToken());
			arr = new int[K];
			selected = new int[6];
			
			for(int i=0; i<K; i++) {
				int value = Integer.parseInt(st.nextToken());
				arr[i] = value;
			}
			Arrays.sort(arr);
			comb(0, 0);
			input = br.readLine();
			
			if(!input.equals("0")) {
				sb.append("\n");
			}
			else {
				break;
			}
		}
		
		bw.write(sb.toString());
		bw.flush();
		bw.close();
		br.close();
	}
	
	static void comb(int depth, int start) {
		if(depth==6) {
			for(int i=0; i<6; i++) {
				sb.append(selected[i] + " ");
			}
			sb.append("\n");
			return;
		}
		
		for(int i=start; i<K; i++) {
			selected[depth] = arr[i];
			comb(depth+1, i+1);
		}
	}
}

결과


post-custom-banner

0개의 댓글