설명
1부터 N까지 번호가 적힌 구슬이 있습니다. 이 중 중복을 허락해 M번을 뽑아 일렬로 나열하는 방법을 모두 출력합니다.
입력
첫 번째 줄에 자연수 N(3<=C<=10)과 M(2<=M<=N)이 주어집니다.
출력
첫 번째 줄에 결과를 출력합니다.
출력순서는 사전순으로 오름차순으로 출력합니다.
예시 입력 1
3 2
예시 출력 1
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
문제 해결
과 에 대해 중복 순열을 만들어 출력하는 문제이다. 중복 순열은 각 요소가 한 번 이상 선택될 수 있는 순열을 을 말한다. 예를 들어 이 3이고 이 2라면, (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)와 같이 각 번호가 여러 번 선택될 수 있는 것이다.
static int N, M;
static int[] selected;
자연수 N과 M에 대해 전역 변수로 선언해주고, 선택된 숫자들을 저장할 selected 배열을 선언해준다.
그 이후 N과 M을 입력받고 selected 배열을 selected = new int[M];
M으로 초기화해준다.
public static void DFS(int L) {
if (L == M) { // M번 뽑았으면 출력
for (int num : selected) {
System.out.print(num + " ");
}
System.out.println();
return;
}
for (int i = 1; i <= N; i++) {
selected[L] = i; // 현재 깊이에 i를 선택
DFS(L + 1); // 다음 깊이로 재귀 호출
}
}
DFS 함수이다. 레벨 L이 M과 같으면, 즉 M번을 모두 뽑았다면, selected 배열에 저장된 모든 숫자를 출력한다.
L이 M이 아니면 1부터 N까지 각 숫자를 선택하고, selected[L]에 넣구 DFS 함수를 호출한다.
DFS(0);
main 에서 DFS(0) 을 호출해 재귀적으로 가능한 순열을 만들고 출력해간다.
최종 코드
import java.util.Scanner;
public class P04_중복순열 {
static int N, M;
static int[] selected;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
N = in.nextInt();
M = in.nextInt();
selected = new int[M];
DFS(0);
}
public static void DFS(int L) {
if (L == M) { // M번 뽑았으면 출력
for (int num : selected) {
System.out.print(num + " ");
}
System.out.println();
return;
}
for (int i = 1; i <= N; i++) {
selected[L] = i; // 현재 깊이에 i를 선택
DFS(L + 1); // 다음 깊이로 재귀 호출
}
}
}
반응형
'알고리즘 문제풀이 입문: 코딩테스트 대비 > 섹션 8. DFS, BFS 활용' 카테고리의 다른 글
순열 구하기 (0) | 2024.05.11 |
---|---|
동전교환 (0) | 2024.05.11 |
최대점수 구하기(DFS) (0) | 2024.05.11 |
바둑이 승차(DFS) (0) | 2024.05.10 |
합이 같은 부분집합(DFS : 아마존 인터뷰) (0) | 2024.05.10 |