순열, 조합, 부분집합

최지홍·2022년 2월 7일
0

매일 공부

목록 보기
13/40

순열, 조합, 부분집합

  • 순열: 서로 다른 n개 중 r개를 ‘순서 있게’ 뽑아 나열
  • nPr
import java.util.Arrays;
import java.util.Scanner;

public class PermutationTest {

	private static int N, R;
	private static int[] input, numbers;
	private static boolean[] isSelected;
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		N = scanner.nextInt();
		R = scanner.nextInt();
		
		input = new int[N];
		numbers = new int[R];
		isSelected = new boolean[N];
		
		for (int i = 0; i < N; i++) {
			input[i] = scanner.nextInt(); 
		}
		
		permutation(0);
		
		scanner.close();
	}
	
	private static void permutation(int count) {
		if (count == R) {
			System.out.println(Arrays.toString(numbers));
			return;
		}
		
		for (int i = 0; i < N; i++) {
			if (!isSelected[i]) {
				isSelected[i] = true; 
				numbers[count] = input[i];
				permutation(count + 1);
				isSelected[i] = false;
			}
		}
	}
	
}
  • 조합: 서로 다른 n개 중 r개를 ‘순서 무관하게’ 뽑아 나열
  • nCr = nPr / r!
import java.util.Arrays;
import java.util.Scanner;

public class CombinationTest {

	private static int N, R;
	private static int[] input, numbers;
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		N = scanner.nextInt();
		R = scanner.nextInt();
		
		input = new int[N];
		numbers = new int[R];
		
		for (int i = 0; i < N; i++) {
			input[i] = scanner.nextInt(); 
		}
		
		permutation(0, 0);
		
		scanner.close();
	}
	
	private static void permutation(int count, int start) {
		if (count == R) {
			System.out.println(Arrays.toString(numbers));
			return;
		}
		
		for (int i = start; i < N; i++) {
			numbers[count] = input[i];
			permutation(count + 1, i + 1);
		}
	}
	
}
  • 부분집합: 집합에 포함된 원소들을 선택
  • 부분집합의 수(공집합 포함): 원소의 수가 n개일 때, 2^n

스택

  • 물건을 쌓아 올리듯 자료를 쌓아 올린 형태의 자료구조
  • 선형 자료구조로, 자료 간 관계가 일대일
  • JVM의 메서드 스택에서 사용되는 방식
  • LIFO
profile
백엔드 개발자가 되자!

0개의 댓글