smooth waters run deep

공부내용/알고리즘

순열 nPr

yeon_11 2020. 11. 11. 15:18

순열

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

 

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

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

 

/*
N : 총 숫자 개수(num.length)
R : 숫자 중에서 뽑는 개수 (nPr에서 r을 의미)
int[] num : 숫자 집합
boolean[] checked : num[]의 숫자 사용 여부
List<Integer> ans : 순열(nPr) 결과를 담는 리스트

1. 숫자 사용X
   1) 사용표시(checked[i]=true), 결과리스트에 추가, 재귀
   2) 사용표시 원상복귀(checked[i]=false), 결과리스트에서 삭제, i++
2. ans.size()==M 이면 출력 후 종료
*/

private static void permutation(int[] num, boolean[] checked, List<Integer> ans){
	if(ans.size() == R){
		for(int i=0; i<ans.size(); i++){
			System.out.print(ans.get(i)+" ");
		}
		System.out.println();
		return;
	}

	for(int i=0; i<N; i++){
		if(!checked[i]){
			checked[i] = true;
			ans.add(num[i]);
			permutation(num, checked, ans);

			checked[i] = false;
			ans.remove(ans.size()-1);
		}
	}
}

 

 

 

 

중복 순열 

   : 순서O, 중복O

 

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

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

 

/*
N : 총 숫자 개수(num.length)
R : 숫자 중에서 뽑는 개수 (nPr에서 r을 의미)
int[] num : 숫자 집합
List<Integer> ans : 순열(nPr) 결과를 담는 리스트

1. 결과리스트에 num[i] 추가
2. 1) 재귀 (1의 결과를 가지고 계속해서 결과리스트에 num[i]를 추가해줌)
   2) 추가한 num[i]를 결과리스트에서 제거 - i++
3. ans.size()==M 이면 출력 후 종료
*/

private static void permutation(int[] num, List<Integer> ans){
	if(ans.size() == R){
		for(int i=0; i<ans.size(); i++){
			System.out.print(ans.get(i)+" ");
		}
		System.out.println();
		return;
	}

	for(int i=0; i<N; i++){
		ans.add(num[i]);
		permutation(num, ans);
		ans.remove(ans.size()-1);
	}
}

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

최대공약수 & 최소공배수  (0) 2020.11.22
조합 nCr  (0) 2020.11.11
부분집합  (0) 2020.11.08
카운팅 정렬 (Counting Sort)  (0) 2020.11.03
소수  (0) 2020.10.20