smooth waters run deep

공부내용/알고리즘

조합 nCr

yeon_11 2020. 11. 11. 15:39

① 조합

   : 순서X, 중복X ('중복'은 자기자신 포함 여부를 의미)

 

   예) 1,2,3,4 중 2개 뽑는 경우

        (1,2) (1,3) (1,4) (2,3) (2,4) (3,4)

 

/*
N : 총 숫자 개수(num.length)
R : 숫자 중에서 뽑는 개수 (nCr에서 r을 의미)
int[] num : 숫자 집합 
int[] ans : 조합(nCr) 결과를 담는 베열
int num_index : num[]의 인덱스
int ans_index : ans[]의 인덱스
int cnt : 숫자가 포함될 경우 카운트하는 변수

1. 숫자를 포함하는 경우
   기존의 num[]배열의 인덱스 증가 / 결과 ans[]배열의 인덱스 증가 / 카운트 증가
2. 숫자를 포함하지 않는 경우
   기존의 num[]배열의 인덱스 증가 / 결과 ans[]배열의 인덱스 변화없음 / 카운트 변화없음
*/

private static void combination(int[] num, int[] ans, int num_index, int ans_index, int cnt){
	if(cnt == R){
		for(int i=0; i<ans.length; i++){
			System.out.print(ans[i]+" ");
		}
		System.out.println();
		return;
	}
	if(num_index>=N)
    			return;

	ans[ans_index] = num[num_index];
	combination(num, ans, num_index+1, ans_index+1, cnt+1); //포함
	combination(num, ans, num_index+1, ans_index, cnt); //포함X
}

 

 

 

 

중복 조합

   : 순서X, 중복O

 

   예) 1,2,3,4 중 2개 뽑는 경우

        (1,1) (1,2) (1,3) (1,4) (2,2) (2,3) (2,4) (3,3) (3,4) (4,4)

 

/*
N : 총 숫자 개수(num.length)
R : 숫자 중에서 뽑는 개수 (nCr에서 r을 의미)
int[] num : 숫자 집합 
int[] ans : 조합(nCr) 결과를 담는 베열
int num_index : num[]의 인덱스
int ans_index : ans[]의 인덱스
int cnt : 숫자가 포함될 경우 카운트하는 변수

1. 숫자를 포함하는 경우
   기존의 num[]배열의 인덱스 변화없음 / 결과 ans[]배열의 인덱스 증가 / 카운트 증가
2. 숫자를 포함하지 않는 경우
   기존의 num[]배열의 인덱스 증가 / 결과 ans[]배열의 인덱스 변화없음 / 카운트 변화없음
*/

private static void combination(int[] num, int[] ans, int num_index, int ans_index, int cnt){
	if(cnt == R){
		for(int i=0; i<ans.length; i++){
			System.out.print(ans[i]+" ");
		}
		System.out.println();
		return;
	}
	if(num_index>=N)
    			return;

	ans[ans_index] = num[num_index];
	combination(num, ans, num_index, ans_index+1, cnt+1); //포함
	combination(num, ans, num_index+1, ans_index, cnt); //포함X
}

 

'공부내용 > 알고리즘' 카테고리의 다른 글

플로이드-와샬 알고리즘 (Floyd's Algorithm)  (0) 2020.11.26
최대공약수 & 최소공배수  (0) 2020.11.22
순열 nPr  (0) 2020.11.11
부분집합  (0) 2020.11.08
카운팅 정렬 (Counting Sort)  (0) 2020.11.03