완전 탐색이란 문제의 해법으로 생각할 수 있는 모든 경우의 수를 나열해 보고 확인하는 기법이다. 모든 경우의 수를 고려하기 때문에 수행 속도는 느리지만, 해답을 보장한다는 특징이 있다. 경우의 수가 상대적으로 작은 경우에 고려해 볼 만한 풀이 방법이다.
☑️ 순열 (Permutation)
☑️ 조합(Combination)
☑️ 부분 집합(Power set)
📌 N개의 주사위를 던져서 순열, 중복 순열, 조합, 중복 조합 중 선택하여 나올 수 있는 모든 경우의 수 계산
import java.io.*;
import java.util.*;
public class Main {
static int N; // 던지는 주사위 수
static int[] numbers; // 각각의 주사위의 눈
static int totalCnt; // 경우의 수
static boolean[] isSelected;
public static void main(String[] args) throws IOException {
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(in.readLine()," ");
int mode=Integer.parseInt(st.nextToken());
N=Integer.parseInt(st.nextToken());
numbers=new int[N];
switch(mode) {
case 1:
isSelected=new boolean[7];
permutation1(0); // 1. 순열 호출
System.out.println("총 경우의수: "+totalCnt);
break;
case 2:
permutation2(0); // 2. 중복 순열 호출
System.out.println("총 경우의수: "+totalCnt);
break;
case 3:
combination1(0,1); // 3. 조합 호출
System.out.println("총 경우의수: "+totalCnt);
break;
case 4: // 중복 조합
combination2(0,1); // 4. 중복 조합 호출
System.out.println("총 경우의수: "+totalCnt);
break;
}
}
// 순열
private static void permutation1(int cnt) {
// 기저 조건
if(cnt==N) {
System.out.println(Arrays.toString(numbers));
totalCnt++;
return;
}
// 유도 파트
for(int i=1;i<=6;i++) {
if(isSelected[i]) continue;
numbers[cnt]=i;
isSelected[i]=true;
permutation1(cnt+1);
isSelected[i]=false;
}
}
// 중복 순열
private static void permutation2(int cnt) {
// 기저 조건
if(cnt==N) {
System.out.println(Arrays.toString(numbers));
totalCnt++;
return;
}
// 유도 파트
for(int i=1;i<=6;i++) {
numbers[cnt]=i;
permutation2(cnt+1);
}
}
// 조합
private static void combination1(int cnt, int start) {
// 기저 조건
if(cnt==N) {
System.out.println(Arrays.toString(numbers));
totalCnt++;
return;
}
// 유도 파트
for(int i=start;i<=6;i++) {
numbers[cnt]=i;
combination1(cnt+1,i+1);
}
}
// 중복 조합
private static void combination2(int cnt, int start) {
// 기저 조건
if(cnt==N) {
System.out.println(Arrays.toString(numbers));
totalCnt++;
return;
}
// 유도 파트
for(int i=start;i<=6;i++) {
numbers[cnt]=i;
combination2(cnt+1,i);
}
}
}