조합 순열 부분집합

  • java에서는 따로 라이브러리가 없어서 구현해야 한다.
  • 조합
    • combination
    • nCr
    • 순서X, 중복X
      • 카드n에서 r만큼 꺼낼때 나오는 경우
  • 순열
    • permutation
    • nPr
    • 순서O
      • 카드n에서 r만큼 꺼내서 순서대로 나열했을때의 경우
  • 부분집합
    • powerset
    • n개의 요소에서 나오는 모든 부분집합
      • 모든 조합이라 할 수 있다.

코드

조합

//arr 조합을 할 배열
//save 조합 한 결과가 들어갈 배열
//idx save의 index값
//start arr을 순회할때 idx의 시작값
static public void combination(int[] arr, int[] save, int idx, int start){
    if(idx==save.lenth){
        //save에 조합의 결과가 저장된다.
        return;
    }
    
    for(int i=start;i<arr.length;i++){//start부터 모든 arr을 순회
        save[idx] = arr[i];//요소 선택
        //idx+1이 되고, 다음 조합으로 i+1부터 순회를 시작한다.
        combination(arr,save, idx+1, i+1);
    }
}

순열

//arr 순열을 할 배열
//save 순열 결과가 들어갈 배열
//visited 순열 선택여부
//idx save의 index값
static public void combination(int[] arr, int[] save, boolean[] visited,int idx){
    if(idx==save.lenth){
        //save에 순열의 결과가 저장된다.
        return;
    }
    
    for(int i=0;i<arr.length;i++){//모든 arr을 순회
        if(visited[i]) continue;
        visited[i] = true;//방문처리
        save[idx] = arr[i];//요소 선택
        combination(arr, save, visited, idx+1);
        visited[i] = false;//방문처리 복구
    }
}

파워셋

//arr 원본 배열
//save true,false로 하여 부분집합을 확인
//idx save의 index값
static public void powerset(int[] arr, boolean[] save,int idx){
    if(idx==arr.lenth){
        //모든 부분집합을 확인할 수 있다.
        //true와 false로 구분하여 부분집합을 만든다.
        return;
    }
    
    save[i] = true;//방문한경우
    powerset(arr, save, idx+1);
    save[i] = false;//방문안한경우
    powerset(arr, save, idx+1);
}