순열 구하기
2022. 5. 3. 12:32ㆍ코딩 테스트(JAVA)/인프런 문제풀이
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
문제 분석
중복 없음
순서 있음
→ 순열
* '중복 없음'을 체크하는 방법 :
- 체크 배열을 활용해서 ch[i] == 0 인 것만 뻗어 나갑니다.
- 사용 했으므로 ch[i] = 1로 바꿉니다.
- 백트래킹시 다시 ch[i] = 0 으로 복구해서 다음 for문에 영향을 끼치지 않도록 합니다.
체크 배열을 제외하면 중복 순열과 코드가 같습니다.
성공 코드
import java.util.Scanner;
public class Main {
static int n,m;
static int[] arr, pm, ch;
public void DFS(int L) {
if(L == m) {
for(int x : pm) System.out.print(x + " ");
System.out.println();
}else {
for(int i=0; i<n; i++) {
// 체크배열 0인것만 뻗어나감
if(ch[i] == 0) {
// 사용했으므로 체크배열 1로 하고, 백트래킹때 0으로 복귀
ch[i] = 1;
pm[L] = arr[i];
DFS(L+1);
ch[i] = 0;
}
}
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
ch = new int[n];
pm = new int[m];
arr = new int[n];
// [ arr채우기 ]
for(int i=0; i<n; i++) {
arr[i] = kb.nextInt();
}
T.DFS(0);
}
}
'코딩 테스트(JAVA) > 인프런 문제풀이' 카테고리의 다른 글
합이 같은 부분집합 (DFS : 아마존 인터뷰) (0) | 2022.05.04 |
---|---|
조합 구하기 (0) | 2022.05.03 |
중복순열 (0) | 2022.05.03 |
💡 이진트리 순회(BFS: Breadth-First Search, 넓이우선탐색, 레벨탐색) (0) | 2022.04.24 |
💡 부분집합 구하기(DFS) (0) | 2022.04.24 |