https://www.acmicpc.net/problem/6603

 

6603번: 로또

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로

www.acmicpc.net

코드설명

백트래킹 문제입니다.

 

문제로직입니다.

  1. 주어진 집합 S를 모두 입력받습니다.
  2. 집합 S중에서 6가지만 뽑으면 되므로, level == 6 일때 중단시키도록 처리합니다.
    1. 이때, level이 올라가는 과정에 idx를 활용하여 해당 자리에서 선택된 수열의 원소 뒤의 원소들만 넣을 수 있도록 처리하여 오름차순으로 정렬하고, 반복된 숫자를 넣지 않도록 설정했습니다.

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
	
	public static int k, S;
	public static int answer = 0;
	public static int[] arr;
	public static boolean[] visited;
	public static int[] answerArr;
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	answerArr = new int[6];
    	while(true) {
    		StringTokenizer st = new StringTokenizer(br.readLine());
    		k = Integer.parseInt(st.nextToken());
    		if(k == 0) 
    			break;
    		
    		arr = new int[k];
    		visited = new boolean[k];
    		for(int i=0;i<k;i++) {
    			arr[i] = Integer.parseInt(st.nextToken());
    		}
    		
    		simulate(0, 0);
    		System.out.println();

    	}
    }
    
    public static void simulate(int idx, int level) {
    	if(level == 6) {
    		for(int i=0;i<6;i++) {
    			System.out.print(answerArr[i]+" ");
    		}
    		System.out.println();
    		return ;
    	}
    	for(int i=idx;i<k;i++) {
    		if(visited[i] == false) {
    			visited[i] = true;
    			answerArr[level] = arr[i];
    			simulate(i+1, level + 1);
    			visited[i] = false;
    		}
    		
    	}
    	
    }
    
}

+ Recent posts