관리 메뉴

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

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

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

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

막무가내막내 2020. 10. 30. 19:00
728x90

www.acmicpc.net/problem/15655

 

15655번: N과 M (6)

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

www.acmicpc.net

 

 

 

 

주석에 풀이를 적어놓았습니다.

 

[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]) { // 방문안하고 현재값이 이전값보다 커야함
                if (count == 0 || (count > 0&& nums[i] > arr[count - 1])) {
                    isVisited[i] = true;
                    arr[count] = nums[i];
                    dfs(count + 1);
                    arr[count] = 0; //0으로 초기화
                    isVisited[i] = false;
                }
            }
        }
    }
}

 

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

728x90
Comments