코public void combinGen(ArrayList<Integer[]> ans, int[] cards, int num, int index, int[] data){
int length = cards.length;
// 카드 후보의 갯수만큼 반복 until data의 length가 num이 될때까지
for ( int j = 0 ; j < )
data[index] = cards[j];
List<Integer> newList = new ArrayList<>(Arrays.stream(cards).boxed().collect(Collectors.toList()));
newlist.remove(j);
// Basecase
if (index == num-1) {
int[] presentData = new int[num];
for (int i = 0; i < num; i++) presentData[i] = data[i];
// 삽입할 데이터가 중복인지 검사
for (int j = 0; j < ans.size(); j++){
//입력할 데이터 박싱
Integer[] boxedPre = Arrays.stream(presentData).boxed().sorted().toArray(Integer[]::new);
Integer[] boxedEle = Arrays.stream(ans.get(i)).boxed().sorted().toArray(Integer[]::new);
boolean detect = false;
for (int i = 0; i < boxedPre.length; i++) {
detect = detect || boxedPre[i] == boxedCom[i];
}
}
if ( !detect ) ans.add(presentData);
}
// end of Basecase
else {
combinGen(ans, newCards, num, index+1, data)
}
Combination은 중복을 허용하지 않으므로 중복을 제외하는 로직이 필요한데 나는 모든 경우의 수를 담을 List의 요소를 새로 입력할 경우의 수를 하나씩 비교하였는데 이것보다 나은 방법은
for(int i = 0; i < length; i++) {
for(int j = i + 1; j < length; j++) {
for(int k = j + 1; k < length; k++) {
}
}
}
처럼 선택한 인덱스 이후의 인덱스만을 가지는 요소들을 세는 방법이 더 효율적이고 수학적이다.