Combination 구현하기

하온푸·2022년 9월 29일
1
코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++) {
          
        }
      }
    }

처럼 선택한 인덱스 이후의 인덱스만을 가지는 요소들을 세는 방법이 더 효율적이고 수학적이다.

profile
떵대지

0개의 댓글