순열이란, 서로 다른 n개의 값 중에서 r개의 숫자를 모든 순서대로 뽑는 경우를 뜻합니다.
중복순열이란, 임의의 집합을 순서대로 나열하는데 순열과 다르게 집합의 원소를 중복해서 선택할 수가 있습니다.
public class Solution {
static int COUNT = 0; // 총 건수(경우의 수)
static int[] src = {1,2,3,4,5};
static int[] tgt = new int[3];
static boolean[] select = new boolean[src.length];
public static void main(String[] args) {
// TODO Auto-generated method stub
perm(0);
System.out.println(COUNT);
}
// 순열
public static void perm(int tgtIdx) {
// 기저조건
if(tgtIdx==tgt.length) {
System.out.println(Arrays.toString(tgt));
COUNT++;
return;
}
for(int i=0; i<src.length; i++) {
if(select[i]) continue;
tgt[tgtIdx] = src[i];
select[i] = true;
perm(tgtIdx+1);
select[i] = false;
}
}
// 중복순열 : nㅠr = n^r
private static void dice1(int cnt) {
if (cnt == N) {
totalCnt++;
System.out.println(
Arrays.toString(numbers));
return;
}
for (int i = 1; i <= 6; i++) {
numbers[cnt] = i;
dice1(cnt + 1);
}
}
}
조합이란, 서로 다른 n개의 값 중에서 순서와 상관없아 r개를 뽑는 것 입니다.
// 조합
public class Basic_Comb_RC_FOR {
static int COUNT;
static int[] src= {1,2,3,4,5};
static int[] tgt=new int[3];
public static void main(String[] args) {
// TODO Auto-generated method stub
comb(0,0);
System.out.println(COUNT);
}
static void comb(int srcIdx,int tgtIdx) {
// 기저조건
if(tgtIdx==tgt.length) {
System.out.println(Arrays.toString(tgt));
COUNT++;
return;
}
for(int i=srcIdx; i<src.length; i++) {
tgt[tgtIdx] = src[i];
comb(i+1,tgtIdx+1);
}
}
}
//조합
public class Basic_Comb_RC_TWO {
static int COUNT;
static int[] src= {1,2,3,4,5};
static int[] tgt=new int[3];
public static void main(String[] args) {
// TODO Auto-generated method stub
comb(0,0);
System.out.println(COUNT);
}
static void comb(int srcIdx,int tgtIdx) {
// 기저조건
if(tgtIdx==tgt.length) {
System.out.println(Arrays.toString(tgt));
COUNT++;
return;
}
//srcIdx 기저조건
if(srcIdx==src.length) return;
tgt[tgtIdx] = src[srcIdx];
comb(srcIdx+1,tgtIdx+1);
comb(srcIdx+1,tgtIdx); // 28 라인을 버리겠다.
}
}