중복순열 구하기

문제

문제

1부터 N까지 번호가 적힌 구슬이 있습니다. 이 중 중복을 허락하여 M번을 뽑아 일렬로 나열 하는 방법을 모두 출력합니다.

입력

첫 번째 줄에 자연수 N(3<=N<=10)과 M(2<=M<=N) 이 주어집니다.

출력

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

입력예제 1

32

출력예제 1

11
12
13

21
22
23
31
32
33

해결방법

img

  • 중복 순열 구할 때, 해당 레벨에서 나머지 원소 부분집합을 다 만들어야 함.
  • 따라서, 그림과 코드 처럼 한 레벨에서 나머지 부분집합을 다 찾기 위해 반복문을 통해 내부에서 DFS 재귀호출을 함.

코드

import java.util.Scanner;

public class Main {

    static int[] pm;
    static int n, m;

    public void DFS(int L) {
        if (L == m) {
            for (int x : pm) System.out.print(x + " ");
            System.out.println();
        } else {
            for (int i = 1; i <= n; i++) {
                pm[L] = i; // 그림 참고
                DFS(L + 1);
            }
        }
    }

    public static void main(String[] args) {
        Main cls = new Main();
        Scanner kb = new Scanner(System.in);
        n = kb.nextInt();
        m = kb.nextInt();
        pm = new int[m];
        cls.DFS(0);
    }
}


© 2024. Chiptune93 All rights reserved.