[Mission] 내가 만든 순열/조합/부분집합 문제
[Mission] 내가 만든 순열/조합/부분집합 문제
💡 순열
혼자 식당에가서 먹을 메뉴를 겹치지 않게 2개 시켜서 먹는 경우의 수
💡 조합
둘이 식당에가서 각자 먹을 메뉴를 겹치지 않게 각각 하나씩 시켜서 먹는 경우의 수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package task;
import java.util.Arrays;
// 조합: 30개 메뉴 중 혼자 메뉴 2개를 먹는 경우 (순서 X, 중복 X)
// 순열: 30개 메뉴 중 두 명이 각각 하나씩 메뉴를 선택하는 경우 (순서 O, 중복 X)
public class 식당_순열_조합 {
static int totalCnt;
static int[] menu = new int[30]; // 메뉴 30
static int n; // 고를 메뉴 개수
static int[] results;// 선택된 메뉴
static boolean[] isSelected;//중복을 피하기 위해 첫 판에서 어떤 수를 뽑았는지 마크해 놓을 배열
public static void main(String[] args) {
for (int i = 0; i < 30; i++) {
menu[i] = i + 1;
}
n=2; // 메뉴 2
System.out.println("혼자 식사");
results = new int[2];
totalCnt = 0;
혼자식사(0,0);
System.out.println("조합 개수:" + totalCnt);
System.out.println("두명 식사");
results = new int[2];
isSelected = new boolean[30];
totalCnt = 0;
두명식사(0);
System.out.println("순열 개수:" + totalCnt);
}
// 혼밥 - 조합(순서 x, 중복 x)
public static void 혼자식사(int cnt, int start) {
if(cnt == n) {
totalCnt++;
System.out.println(Arrays.toString(results));
return;
}
for (int i = start; i < 30; i++) {
results[cnt] = menu[i];
혼자식사(cnt + 1, i + 1);
}
}
// 두명 식사 (순서O, 중복X)
public static void 두명식사(int cnt) {
if (cnt == 2) {
totalCnt++;
System.out.println(Arrays.toString(results));
return;
}
for (int i = 0; i < 30; i++) {
if (isSelected[i]) continue;
results[cnt] = menu[i];
isSelected[i] = true;
두명식사(cnt + 1);
isSelected[i] = false;
}
}
}
💡 부분집합 : 메뉴 조합
1
2
3
김밥, 떡볶이, 튀김, 오뎅, 치즈볼 중에서 식사할 메뉴를 골라서 먹으려 합니다.
식사할 메뉴를 선택하는 방법은 여러 가지가 있을 수 있습니다. 예를 들어, 한 가지 메뉴만 선택하거나, 두 가지 메뉴를 고를 수도 있습니다.
또한, 세 가지 메뉴나 네 가지 메뉴를 선택하는 것도 가능합니다. 가능한 모든 메뉴의 조합을 구하세요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package task;
public class 식당_부분집합 {
static int totalCnt;
static String[] menu = {"김밥", "떡볶이", "튀김", "오뎅", "치즈볼"}; // 메뉴 5개
static boolean[] isSelected;
public static void main(String[] args) {
isSelected = new boolean[5];
subset(0);
System.out.println("총 부분집합의 개수: " + totalCnt);
}
// 부분집합 생성 함수
public static void subset(int cnt) {
// cnt가 5이면 모든 원소를 고려한 상태이므로 부분집합을 하나 완성한 것
if (cnt == 5) {
++totalCnt;
for (int i = 0; i < 5; i++) {
System.out.print((isSelected[i] ? menu[i] : "X") + " ");
}
System.out.println();
return;
}
// 현재 메뉴를 선택하는 경우
isSelected[cnt] = true;
subset(cnt + 1); // 다음 메뉴로 진행
// 현재 메뉴를 비선택하는 경우
isSelected[cnt] = false;
subset(cnt + 1); // 다음 메뉴로 진행
}
}
This post is licensed under CC BY 4.0 by the author.