자바공부

[JAVA]순열 조합 부분집합

COOLER 2022. 2. 13. 19:04

순열 : 서로 다른 n개 원소 중에서 r 개 원소를 뽑아서 줄을 세워 나열하는 것 nPr

순열은 줄을 세워 나열한다고 말한것 처럼 원소의 순서에 따라 서로 다르게 경우의 수로 생각합니다 

예 : {2,1} 와 {1,2}는 서로 다른 경우의 수이다

간단한 예시 :

3명의 학생 A, B, C 중 반장과 부반장을 구하는 경우의 수를 구하라

반장 부반장
A B
A C
B A
B C
C A
C B

 

public class permutation_test { // 반장과 부반장을뽑는 프로그램 
	// 선택하고자 하는 대상 집합.
	static String[] member = new String[] { "A", "B", "C" };
	
	static boolean[] visited = new boolean[3]; //뽑았는지 안뽑았는지 확인하는 boolean
	
	static String [] answer =new String[2];

	public static void main(String[] args) {
		permutation(0);
	}

	// 순열  cnt 는 현재 몇명을 뽑았는지를 뜻한다 
	private static void permutation(int cnt) {
		// 2명 즉 반장과 부반장이 모두 뽑혔으니까 배열을 출력하고 return
		if (cnt == 2) {
			for(int i=0;i<2;i++) {
				System.out.print(answer[i]);
			}
			System.out.println();
			return;
		}
		// 대상 집합을 순회하며 문자를 하나 선택한다.
		for (int i = 0; i < 3; i++) {
			// 이미 answer 에 뽑혀있을경우에는  continue;
			if (visited[i]) {
				continue;
			}
			// 선택하지 않은경우, 선택했다는 표시를 해준다.
			visited[i] = true; //뽑은경우
			answer[cnt]=member[i]; // answer 에 값을 추가 
			permutation(cnt + 1); // 한명을 뽑은것임으로 cnt +1 을해주고 재귀호출
			// 선택을 해제한다.
			visited[i] = false; // 안뽑은경우 
		}
	}
}

결과

 

조합 : 서로 다른 n개의 원소 중에서 r개를 고르는 것 nCr

조합은 순열과 달리 순서에 따라 다른 경우라고 생각하지 않습니다 

예 : {2,1}와 {1,2}는 서로 같은 경우의 수이다

간단한 예시 :

3명의 학생 A, B, C 중 주번 2명을 구하는 경우의 수를 구하라

주번 주번
A B
A C
B C

 

public class combination_test {
static String[] member = new String[] { "A", "B", "C" };
	

	
	static String [] answer =new String[2];

	public static void main(String[] args) {
		combination(0,0);
	}

	//  cnt 는 현재 몇명을 뽑았는지를 뜻한다 
	private static void combination(int cnt ,int start) {
		// 2명의 주번이  모두 뽑혔으니까 배열을 출력하고 return
		if (cnt == 2) {
			for(int i=0;i<2;i++) {
				System.out.print(answer[i]);
			}
			System.out.println();
			return;
		}
		// 대상 집합을 순회하며 문자를 하나 선택한다.
		for (int i = start; i < 3; i++) {
			// 이미 answer 에 뽑혀있을경우에는  continue;
		
			answer[cnt]=member[i]; // answer 에 값을 추가 
			combination(cnt + 1 , i+1); // 한명을 뽑은것임으로 cnt +1 와 i+1을해주고 재귀호출
			
		}
	}

}

결과

 

부분집합 : PowerSet 또는 SubSet이며 원소를 이용해 만들 수 있는 모든 부분집합을 뜻한다 2^n 개

간단한 예시 :

3명의 학생 A, B, C 중 장기자랑에 참가하는 경우의 수를 구하라 

모두 다 참여할 수 도 있고 , 모두 다 참여하지 않을 수도 있다 

{ABC}
{AB}
{AC}
{A}
{BC}
{B}
{C}
{}

 

public class subset_test {
	
static String[] member = new String[] { "A", "B", "C" };
static boolean[] visited = new boolean[3];

	

	public static void main(String[] args) {
		subset(0);
	}

	// 순열  cnt 는 현재 몇명을 뽑았는지를 뜻한다 
	private static void subset(int cnt) {
		// 2명의 주번이  모두 뽑혔으니까 배열을 출력하고 return
		if (cnt == 3) {
			System.out.print("{");
			for(int i=0;i<3;i++) {
				if(visited[i]) {
					System.out.print(member[i]);
				}
			}
			System.out.print("}");
			System.out.println();
			return;
		}
		// 대상 집합을 순회하며 문자를 하나 선택한다.
		visited[cnt]=true;
		subset(cnt+1);
		visited[cnt]=false;
		subset(cnt+1);
		
			
		}
	}

 

결과