관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[알고리즘] 백준 15654 N과 M(5) -백트랙킹- 자바 본문

알고리즘/DFS, BFS, 시뮬, 백트래킹

[알고리즘] 백준 15654 N과 M(5) -백트랙킹- 자바

막무가내막내 2020. 10. 28. 15:32
728x90

www.acmicpc.net/problem/15654

 

15654번: N과 M (5)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net

 

 

분류별풀기에서 백트랙킹을 보다 N과 M 시리즈가 더있길래 풀어봤습니다.

 

순서대로 출력해야하므로 정렬하고 백트랙킹 써주면 됩니다.

 

풀이는 다음과 같습니다.

 

[Java]

import java.util.Arrays;
import java.util.Scanner;

class Main {
    static int[] nums;
    static int[] arr;
    static boolean[] isVisited;
    static int N;
    static int M;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        M = sc.nextInt();
        nums = new int[N];
        arr = new int[N];
        isVisited = new boolean[N];
        for (int i = 0; i < N; i++) {
            nums[i] = sc.nextInt();
        }
        Arrays.sort(nums);
        dfs(0);
        System.out.println(sb.toString());
    }

    private static void dfs(int count) {
        if (count == M) {
            for (int i = 0; i < M; i++) {
                sb.append(arr[i]).append(" ");
            }
            sb.append("\n");
            return;
        }
        for (int i = 0; i < N; i++) {
            if (!isVisited[i]) {
                isVisited[i] = true;
                arr[count] = nums[i];
                dfs(count + 1);
                isVisited[i] = false;
            }
        }
    }
}

 

 

댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!

728x90
Comments