ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA]순열 조합 부분집합
    자바공부 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);
    		
    			
    		}
    	}

     

    결과

    댓글

Designed by Tistory.