[Java] 순열과 조합
순열 Permutation ( nPr )
순열이란 서로 다른 n개중에 r개를 선택하는 경우의 수(순서 상관 있음) = n! / (n-r)!
백준 순열문제
조합 Combination ( nCr )
조합이란 서로 다른 n개중에 r개를 선택하는 경우의 수(순서 상관 없음) = n! / ((n-r)! * r!)
백준 조합문제
소스 코드
package testcase;
import java.util.Arrays;
public class CP {
//순열
void p ( int[] arr, int[] out, int[] ck, int d, int n, int r) {
if( d == r){
for(int i=0;i<r;i++) { // r 만큼
System.out.format("%d ",out[i]); //출력 out
}
System.out.format("\n");
return;
}
for(int i=0;i<arr.length;i++) {
if( ck[i] == 0 ) {
ck[i] = 1;
out[d] = arr[i]; // 중요
p ( arr, out, ck, d+1, n, r); // d+1
ck[i] = 0;
}
}// end for
}
//조합
void c ( int[] arr, int[] ck, int d, int n, int r) {
if(r == 0) {
for(int i=0 ; i<n ; i++) { // 시작 i < n
if(ck[i]==1) {
System.out.format("%d ",arr[i]); //출력 arr
}
}
System.out.format("\n");
return;
}
for(int i = d ;i < arr.length;i++) { // 중요 시작점 d
ck[i] = 1;
c(arr, ck, i+1 , n , r-1 ); // i+1 , , r-1
ck[i] = 0;
}
}
public static void main(String[] args) {
int[] arr = new int[] {1,2,3,4,5};
int [] ck = new int[arr.length];
int [] out = new int[arr.length];
CP obj = new CP();
//obj.p(arr, out, ck, 0, arr.length, 5);
obj.c(arr, ck, 0, arr.length, 3);
}
}
// 출력 obj.p(arr, out, ck, 0, arr.length, 5);
1 2 3 4 5
1 2 3 5 4
1 2 4 3 5
1 2 4 5 3
1 2 5 3 4
1 2 5 4 3
1 3 2 4 5
1 3 2 5 4
1 3 4 2 5
1 3 4 5 2
1 3 5 2 4
1 3 5 4 2
1 4 2 3 5
1 4 2 5 3
1 4 3 2 5
1 4 3 5 2
1 4 5 2 3
1 4 5 3 2
1 5 2 3 4
1 5 2 4 3
1 5 3 2 4
1 5 3 4 2
1 5 4 2 3
1 5 4 3 2
2 1 3 4 5
2 1 3 5 4
2 1 4 3 5
2 1 4 5 3
2 1 5 3 4
2 1 5 4 3
2 3 1 4 5
2 3 1 5 4
2 3 4 1 5
2 3 4 5 1
2 3 5 1 4
2 3 5 4 1
2 4 1 3 5
2 4 1 5 3
2 4 3 1 5
2 4 3 5 1
2 4 5 1 3
2 4 5 3 1
2 5 1 3 4
2 5 1 4 3
2 5 3 1 4
2 5 3 4 1
2 5 4 1 3
2 5 4 3 1
3 1 2 4 5
3 1 2 5 4
3 1 4 2 5
3 1 4 5 2
3 1 5 2 4
3 1 5 4 2
3 2 1 4 5
3 2 1 5 4
3 2 4 1 5
3 2 4 5 1
3 2 5 1 4
3 2 5 4 1
3 4 1 2 5
3 4 1 5 2
3 4 2 1 5
3 4 2 5 1
3 4 5 1 2
3 4 5 2 1
3 5 1 2 4
3 5 1 4 2
3 5 2 1 4
3 5 2 4 1
3 5 4 1 2
3 5 4 2 1
4 1 2 3 5
4 1 2 5 3
4 1 3 2 5
4 1 3 5 2
4 1 5 2 3
4 1 5 3 2
4 2 1 3 5
4 2 1 5 3
4 2 3 1 5
4 2 3 5 1
4 2 5 1 3
4 2 5 3 1
4 3 1 2 5
4 3 1 5 2
4 3 2 1 5
4 3 2 5 1
4 3 5 1 2
4 3 5 2 1
4 5 1 2 3
4 5 1 3 2
4 5 2 1 3
4 5 2 3 1
4 5 3 1 2
4 5 3 2 1
5 1 2 3 4
5 1 2 4 3
5 1 3 2 4
5 1 3 4 2
5 1 4 2 3
5 1 4 3 2
5 2 1 3 4
5 2 1 4 3
5 2 3 1 4
5 2 3 4 1
5 2 4 1 3
5 2 4 3 1
5 3 1 2 4
5 3 1 4 2
5 3 2 1 4
5 3 2 4 1
5 3 4 1 2
5 3 4 2 1
5 4 1 2 3
5 4 1 3 2
5 4 2 1 3
5 4 2 3 1
5 4 3 1 2
5 4 3 2 1
// 출력 obj.c(arr, ck, 0, arr.length, 3);
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5