並べ替えと組合せ
整列
static void permutation(int[] arr, int[] sel, int k, boolean[] v) {
if(k==sel.length) {
System.out.println(Arrays.toString(sel));
return;
}
for(int i=0; i<arr.length; i++) {
//아직 안뽑은 애면 들어간다!
if(v[i]) continue;
v[i]=true;
sel[k]=arr[i];
permutation(arr, sel, k+1, v);
v[i]=false;
}
}
}
繰り返し順
/**
*
* @param arr
* @param sel 뽑은 배열
* @param k 뽑을 인덱스
*/
private static void purmutation(int[] arr, int[] sel, int k) {
if(k==sel.length) {
//다 골랐어요
System.out.println(Arrays.toString(sel));
return;
}
for(int i=0; i<arr.length; i++) {
sel[k] = arr[i];
purmutation(arr, sel, k+1);
}
コンポジット
X順Xの繰り返し
方法。
private static void combination(int[] arr, int[] sel, int idx, int k) {
if(k==sel.length) {
System.out.println(Arrays.toString(sel));
return;
}
for(int i=idx; i<arr.length; i++) {
sel[k]=arr[i];
//중복조합은 i, 조합은 i+1
//나보다 앞에 있는 애들은 이미 겹치고(순서X), 나는 중복되니까(중복X), 나 다음부터 시작한다
combination(arr, sel, i+1, k+1);
}
}
方法。
private static void combination(int[] arr, int[] sel, int idx, int k) {
if(k==sel.length) {
System.out.println(Arrays.toString(sel));
return;
}
for(int i=idx; i<arr.length; i++) {
sel[k]=arr[i];
//중복조합은 i, 조합은 i+1
//나보다 앞에 있는 애들은 이미 겹치고(순서X), 나는 중복되니까(중복X), 나 다음부터 시작한다
combination(arr, sel, i+1, k+1);
}
}
/**
* @param chus 원본배열
* @param idx 원본 인덱스
* @param k 뽑을 인덱스
* @param sel 뽑은 배열 (고른 배열)
*/
static void recursive(int idx, int k, int[] sel) {
//총 7개의 출력이 나온다. 왜냐하면 2^3 - 1(다뽑는 경우. 2개까지만 뽑으니까!)
if(k==sel.length) {
//다 골랐어요
System.out.println(Arrays.toString(sel));
return;
}
if(idx==arr.length) {
//더 고를게 없어요
System.out.print(k);
System.out.println("안뽑");
return;
}
//뽑는 경우
sel[k]=arr[idx];
recursive(idx+1, k+1, sel);
//안뽑는 경우
recursive(idx+1, k, sel);
}
くりかえしくみたて
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {1,3,5};
combination(arr,new int[2], 0,0);
}
private static void combination(int[] arr, int[] sel, int idx, int k) {
if(k==sel.length) {
System.out.println(Arrays.toString(sel));
return;
}
for(int i=idx; i<arr.length; i++) {
sel[k]=arr[i];
//나보다 앞에 있는 애들은 이미 겹친다. 나부터 시작
combination(arr, sel, i, k+1);
}
}
電源ユニット
/**
*
* @param idx 원본 인덱스
* @param k 뽑을 인덱스
* @param sel
*/
static void powerSet(int idx, int k, boolean[] sel) {
if(idx==arr.length) {
// System.out.println(Arrays.toString(sel));
// 몇개짜리 부분집합인지 고를 수 있음
// if(k==2) {
for(int i=0; i<sel.length; i++) {
if(sel[i]) System.out.print(arr[i]+" ");
}
System.out.println();
// }
return;
}
//뽑는 경우
sel[idx]=true;
powerSet(idx+1,k+1,sel);
//안뽑는 경우
sel[idx]=false;
powerSet(idx+1, k, sel);
}
Reference
この問題について(並べ替えと組合せ), 我々は、より多くの情報をここで見つけました https://velog.io/@co323co/순열과-조합テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol