728x90
반응형
순열 구하기
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
문제 풀이 순서
- N개의 자연수 -> M개를 뽑아 나열
- ds
- 값을 저장하는 리스트
- 자연수 n개 중 저장
- 중복확인 리스트
- n개의 중복확인
- 순열을 일렬로 배열하는 리스트
- m개를 뽑는다.
- 값을 저장하는 리스트
- L==m이 되면
- 저장된 배열을 출력
- 그 외에는 L==m이 될때 까지
- 자연수 n개만큼 반복하는데
- 중복체크 하면서 값 배열에서 가져오기
- 사용하기 전 체크리스트에 1로 변경
- 값 배열에서 가져와 결과 배열에 넣기
- 기준 값 다음 값 가져오기
- 사용 후 체크리스트 0으로 초기화
import java.util.Scanner;
//순열 구하기 [중복 제외]
//N개의 자연수 중 M개를 뽑아 중복 없이 일렬로 나열
//사전순으로 오름차순
class Main {
static int n, m, answer;
static int[] pm, ch, arr;
// pm: 결과 배열, ch : 중복 체크 배열, arr : 값 배열
public void DFS(int L) {
// 3 2-> 3 6 9 -> 3 6, 3 9, 6 3, 6 9, 9 3, 9 6
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;
// 사용하기 전 체크리스트에 1로 변경
pm[L] = arr[i];
// 값 배열에서 가져와 결과 배열에 넣기
DFS(L + 1);
// 기준 값 다음 값 가져오기
ch[i] = 0;
// 사용 후 체크리스트 0으로 초기화
}
}
}
}
public static void main(String[] args) {
Main T = new 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);
}
}
728x90
반응형
'Java > Java 알고리즘 인프런' 카테고리의 다른 글
[Ch.08 - DFS] 10. 수열 추측하기 # (0) | 2022.07.30 |
---|---|
[Ch.08 - DFS] 09. 조합의 경우수(메모이제이션) (0) | 2022.07.29 |
[Ch.08 - DFS] 07. 동전교환 # (0) | 2022.07.29 |
[Ch.08 - DFS] 06. 중복순열 구하기 (0) | 2022.07.29 |
[Ch.08 - DFS] 05. 최대점수 구하기 (0) | 2022.07.29 |