반응형
12-01 01:41
Today
Total
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
관리 메뉴

개발하는 고라니

[백준] 6603번 : 로또 본문

Programming/백준

[백준] 6603번 : 로또

조용한고라니 2021. 3. 26. 19:04
반응형
 

6603번: 로또

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

www.acmicpc.net


[DFS + 백트래킹]

K개의 수를 저장한 배열 arr에 대하여 백트래킹 DFS를 수행한다.

총 K번 반복문을 도는 루프에서 각 시작 정점을 arr[i]번으로 하고, depth가 5가 되면 출력을 위한 버퍼에 현재 방문한 정점들을 담는다.

 

백트래킹을 하기 위해 DFS 내에서 방문 -> DFS 탐색 -> 방문 취소 가 이뤄져야 한다.

# Code </>

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

public class Main {

    static int k;
    static int[] arr = new int[14];
    static boolean[] visit = new boolean[14];
    static StringBuilder sb;

    static void DFS(int cur, int depth){

        if(depth == 5){
            for(int i=0; i<k; i++)
                if(visit[i])
                    sb.append(arr[i]).append(' ');

            sb.append('\n');
            return;
        }

        for(int i=cur; i<k; i++)
            if(!visit[i]) {
                visit[i] = true;
                DFS(i, depth + 1);
                visit[i] = false;
            }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while(true){
            StringTokenizer st = new StringTokenizer(br.readLine());
            sb = new StringBuilder();

            k = Integer.parseInt(st.nextToken());

            if(k == 0) break;

            for(int i=0; i<k; i++)
                arr[i] = Integer.parseInt(st.nextToken());

            for(int i=0; i<k; i++) {
                visit[i] = true;
                DFS(i, 0);
                visit[i] = false;
            }

            System.out.println(sb);
        }
    }
}
반응형
Comments