728x90
반응형
04. 중복순열 구하기
1부터 N까지 번호가 적힌 구슬이 있습니다. 이 중 중복을 허락하여 M번을 뽑아 일렬로 나열
하는 방법을 모두 출력합니다.
입력설명
첫 번째 줄에 자연수 N(3<=N<=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
문제 풀이 순서 : 구슬의 개수만큼 반복하는데, 구슬의 개수가 배열의 길이가 된다면, 배열 출력
- 배열의 길이 n으로 된, 결과배열 선언
- DFS -> O,X로 나눈다
- 중복을 허용해 N개중 M번을 뽑아 모두 나열하기
- L==m이면, 배열 모두 출력
- 그외엔 깊이탐색
- 구슬의 개수까지 반복하는데
- M개의 배열에 구슬을 뽑은 순서대로 구슬의 번호를 결과배열에 저장
- 다음 구슬 뽑기
import java.util.Scanner;
//중복 순열
//N까지 번호가 적힌 구슬을 중복 허용해 M번 뽑아 일렬로 나열
//자연수 N과 M
//사전순으로 오름차순 출력
class Main {
static int n,m;
static int[] pm;
public void DFS(int L) {
if(L==m) {
//구슬의 개수가 M번일 경우
for(int x: pm)
//배열에 있는 모든 숫자 출력
System.out.println(x+" ");
}
else {
for(int i=1;i<=n;i++) {
//구슬의 개수까지 반복
pm[L]=i;
//M개의 배열에 구슬을 뽑은 순서대로 구슬의 번호 입력
DFS(L+1);
//다음 구슬 뽑기
}
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
n=kb.nextInt();
m=kb.nextInt();
pm=new int[m];
//m개의 배열 생성
T.DFS(0);
}
}
+) arr를 전역 변수로
import java.util.Scanner;
public class Main {
static int[] pm;
static int n, m;
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
pm = new int[m];
DFS(0);
}
static void DFS(int L) {
if (L == m) {
for (int x : pm)
System.out.print(x + " ");
System.out.println();
return;
} else {
for (int i = 1; i <= n; i++) {
pm[L] = i;
DFS(L + 1);
}
}
}
}
728x90
반응형
'Java > Java 알고리즘 인프런' 카테고리의 다른 글
[Ch.08 - DFS] 08. 순열 구하기 (0) | 2022.07.29 |
---|---|
[Ch.08 - DFS] 07. 동전교환 # (0) | 2022.07.29 |
[Ch.08 - DFS] 05. 최대점수 구하기 (0) | 2022.07.29 |
[Ch.08 - DFS] 04. 바둑이 승차 (0) | 2022.07.29 |
[Ch.08 - DFS] 03. 합이 같은 부분집합 (1) | 2022.07.29 |