순열 구하기

문제

문제

10이하의 N개의 자연수가 주어지면 이 중 M개를 뽑아 일렬로 나열하는 방법을 모두 출력합 니다.

입력설명

첫 번째 줄에 자연수 N(3<=N<=10)과 M(2<=M<=N) 이 주어집니다. 두 번째 줄에 N개의 자연수가 오름차순으로 주어집니다.

출력설명

첫 번째 줄에 결과를 출력합니다. 출력순서는 사전순으로 오름차순으로 출력합니다.

입력예제 1

3 2
3 6 9

출력예제 1

3 6
3 9
6 3

6 9
9 3
9 6

해결방법

  • 중복을 허용하지 않는다!
    • 체크하는 로직이 필요. 체크용 무언가(변수)가 필요하다.
    • 체크를 하여, 중복이 아닌 경우에는 로직 수행 중복인 경우에는 로직 수행을 하지 않는 부분이 필요하다.
  • 함수 스택 그려보는 연습 필요.

코드

import java.util.*;

class Main {
    static int[] pm, ch, arr;
    static int n, m;

    public void DFS(int L) {
        // m 개를 뽑은 경우 배열에서 출력
        if (L == m) {
            for (int x : pm) System.out.print(x + " ");
            System.out.println();
        } else {
            // 반복을 통해 재귀호출
            for (int i = 0; i < n; i++) {
                // 뽑지 않은 경우에만 진행
                if (ch[i] == 0) {
                    // 체크 배열에 뽑았다고 체크 후, 
                    ch[i] = 1;
                    // 값을 넣어준 뒤
                    pm[L] = arr[i];
                    // 재귀 호출하고
                    DFS(L + 1);
                    // 다시 뽑지 않음으로 돌림.
                    ch[i] = 0;
                }
            }
        }
    }

    public static void main(String[] args) {
        Main.Main T = new Main.Main();
        Scanner kb = new Scanner(System.in);
        n = kb.nextInt();
        m = kb.nextInt();
        arr = new int[n];
        for (int i = 0; i < n; i++) arr[i] = kb.nextInt();
        ch = new int[n];
        pm = new int[m];
        T.DFS(0);
    }
}


© 2024. Chiptune93 All rights reserved.