순열
순열이란 n개의 원소에서 r개의 원소를 *순서에 상관 있이* 뽑는 경우의 수를 의미한다.
공식 : nPr
ex) 5종류의 음식 중에 2명이 각자 먹을 음식을 시키는 경우의 수(이때 음식을 중복으로 주문하면 안된다.)
5!/(5-2)!
코드
package permu;
import java.util.Arrays;
public class sunyul {
static String arr[] = {"햄버거","피자","떡뽂이","샌드위치","김치찌개"};
static boolean visit[];
static String result[];
static int N = 2; // 고르는 개수
public static void main(String[] args) {
// TODO Auto-generated method stub
//5가지 메뉴중 2가지 골라야함
visit = new boolean[5];
result = new String[2]; // 시킨 메뉴 저장
back(0);
}
private static void back(int def) {
// TODO Auto-generated method stub
if(def==N) {//두가지 메뉴를 다 골랐다면 출력
System.out.println(Arrays.toString(result));
return;
}
for(int i=0;i<5;i++) {
if(!visit[i]) { //시키지 않은 음식이라면
result[def] = arr[i]; // 결과값에다 저장
visit[i] = true;
back(def+1); //다음 메뉴 선정하러 가기
visit[i] = false;
}
}
}
}
결과값
조합
조합이란 순열과비슷하게 n개 중 순서에 상관없에 r개의 원소를 뽑지만 순열과 다르게 *순서에 상관 없이 * 뽑는 경우의 수이다.
공식 : nCr
ex) 5종류의 음식 중에 2명이 먹을 음식을 시키는 경우(어짜피 갈라먹을꺼니까 니꺼 내꺼 신경쓰지말고 시키자!)
5*4/2*1 => 10
코드
package permu;
import java.util.Arrays;
public class zohap {
static String arr[] = {"햄버거","피자","떡뽂이","샌드위치","김치찌개"};
static boolean visit[];
static String result[];
static int N = 2; // 고르는 개수
public static void main(String[] args) {
// TODO Auto-generated method stub
//5가지 메뉴중 2가지 골라야함
visit = new boolean[5];
result = new String[2]; // 시킨 메뉴 저장
back(0,0);
}
private static void back(int def,int start) {
// TODO Auto-generated method stub
if(def==N) {//두가지 메뉴를 다 골랐다면 출력
System.out.println(Arrays.toString(result));
return;
}
for(int i=start;i<5;i++) {
if(!visit[i]) { //시키지 않은 음식이라면
result[def] = arr[i]; // 결과값에다 저장
visit[i] = true;
back(def+1,i+1); //다음 메뉴 선정하러 가기
visit[i] = false;
}
}
}
}
조합 코드에서 중요한 점은 start 변수도 넘겨준다는 것이다. 이 때 순열 코드 처음 짜는 사람들이 하는 국룰 실수 !!!!!
back(def+1,start+1) --> 절대 안된다. i변수를 넣어야한다.
결과값
부분집합 (power set)
집합의 원소로 이루어진 집합 (공집합도 포함 )
2^n (선택 하냐 안하냐로 2의 n임)
ex) 5종류의 음식가지고 0개부터 5개까지 시킬 수 있는 경우의 수
코드
package permu;
import java.util.Arrays;
public class powerSet {
static String arr[] = {"햄버거","피자","떡뽂이","샌드위치","김치찌개"};
static boolean visit[];
public static void main(String[] args) {
// TODO Auto-generated method stub
visit = new boolean[5];
back(0);
}
private static void back(int def) {
// TODO Auto-generated method stub
if(def==5) {//다 돌았다면
for(int i=0;i<5;i++) {
if(visit[i]) {
System.out.print(arr[i]+" ");
}
}
System.out.println();
return;
}
visit[def] = false;
back(def+1);
visit[def] = true;
back(def+1);
}
}
결과값
결과값에서 중요한 점은 마지막 공집합도 출력된다는 점이다. 만약 공집합이 필요없다면 이 부분 유의하며 코딩을 해야한다.
'[알고리즘]' 카테고리의 다른 글
counting 정렬과 [백준] 11650번 (0) | 2022.12.08 |
---|---|
[수학] 유클리드 호제법 (0) | 2022.11.17 |
binarysearch이진탐색이분탐색이라고 불리는 거 java로 만들어봐! (0) | 2022.11.15 |
[백준] 1764번 듣보잡!!!!!문제 hashmap문제 (0) | 2022.11.15 |
소수를 출력해보자-2 (에라토스테네스의 체) (0) | 2022.11.09 |