nPr
nPr = n * (n-1) * (n-2) * … * (n-r+1)
n! = n * (n-1) * (n-2) * … * 2 * 1
12! = 479,001,600
for (int i = 0; i <N; i++) { //첫번째 원소 선택
for (int j = 0; j <N; j++) { //두번째 원소 선택
for (int k = 0; k <N; k++) { //세번째 원소 선택
System.out.printf("%d %d %d%n", data[i], data[j], data[k]);
}
}
}
for (int i = 0; i <N; i++) { //첫번째 원소는 다 선택
for (int j = 0; j <N; j++) { //두번째 원소 선택
if(i !=j ) { //첫번째 원소와 중복 되는 원소는 제거
for (int k = 0; k <N; k++) {//세번째 원소 선택
if(i!=k && j!=k) { //첫번째 원소와 두번째 원소와 중복 되는 원소 제거
System.out.printf("%d %d %d%n", data[i], data[j], data[k]);
}
}
}
}
}
//기저 - 유도로 구한 경우
public static void permutation(int depth) {
//배열은 0부터 시작하므로 R-1개가 모든 원소를 뽑은 상황.
//depth가 R과 동일한 상황은 순열 하나의 모든 원소를 다 뽑은 상황
if(depth == R) {
//순열을 뽑은 이후의 task를 작성한다.
return;
}
//원소를 선택
for (int i = 0; i <N; i++) {
numbers[depth] = input[i];
permutation(depth+1);
}
}
//기저 - 유도로 구한 경우
public static void permutation(int depth) {
//배열은 0부터 시작하므로 R-1개가 모든 원소를 뽑은 상황.
//depth가 R과 동일한 상황은 순열 하나의 모든 원소를 다 뽑은 상황
if(depth == R) {
//순열을 뽑은 이후의 task를 작성한다.
return;
}
//원소를 선택
top:
for (int i = 0; i <N; i++) {
//중복 검사
for (int j = 0; j < depth; j++) {
if(numbers[j] == input[i]) { //중복된 경우
continue top;
}
}
numbers[depth] = input[i];
permutation(depth+1);
}
}
//기저 - 유도로 구한 경우
public static void permutation(int depth) {
//배열은 0부터 시작하므로 R-1개가 모든 원소를 뽑은 상황.
//depth가 R과 동일한 상황은 순열 하나의 모든 원소를 다 뽑은 상황
if(depth == R) {
//순열을 뽑은 이후의 task를 작성한다.
return;
}
//원소를 선택
for (int i = 0; i <N; i++) {
//중복 검사
if(isSelected[i]) continue;
numbers[depth] = input[i];
isSelected[i] = true;
permutation(depth+1);
isSelected[i] = false;
}
}
//기저 - 유도로 구한 경우
public static void permutation(int depth, int flag) {
//배열은 0부터 시작하므로 R-1개가 모든 원소를 뽑은 상황.
//depth가 R과 동일한 상황은 순열 하나의 모든 원소를 다 뽑은 상황
if(depth == R) {
//순열을 뽑은 이후의 task를 작성한다.
return;
}
//원소를 선택
for (int i = 0; i <N; i++) {
//중복 검사
if((flag & 1<< i) !=0) continue;
numbers[depth] = input[i];
permutation(depth+1, flag | 1<<i);
}
}
//기저 - 유도로 구한 경우
public static void permutation(int depth) {
//배열은 0부터 시작하므로 R-1개가 모든 원소를 뽑은 상황.
if(depth == R-1) {
//순열을 뽑은 이후의 task를 작성한다.
return;
}
//원소를 선택
for (int i = depth; i <N; i++) {
swap(i, depth);
permutation(depth+1);
swap(i, depth);
}
}
private static void swap(int i, int depth) {
int temp = input[i];
input[i] = input[depth];
input[depth] = temp;
}