์์ ํ์์ ์ผ์ด์ฌ - ์์ด, ์กฐํฉ, ๋ถ๋ถ์งํฉ
์์ ํ์
- ๋ฌธ์ ์ ํด๋ฒ์ผ๋ก ์๊ฐํ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋์ดํ๊ณ ํ์ธ
- Brute-Force / Generate & Test
- ๊ฒฝ์ฐ์ ์๊ฐ ์์ ๋ ์ ์ฉ
- ์ํ ์๋๋ ๋๋ฆฌ์ง๋ง, ํด๋ต ์ฐพ๊ธฐ๋ฅผ ์คํจํ ํ๋ฅ ์ด ๋ฎ์
์์ด
- ์๋ก ๋ค๋ฅธ ๊ฒ๋ค ์ค ๋ช ๊ฐ๋ฅผ ๋ฝ์ ์์๊ฐ ์๊ฒ ๋์ด
- TSP(Traveling Salesman Problem) ๋ฑ
O(n!)
์ ์๊ฐ๋ณต์ก๋
์์ด์ ์ฌ๊ท์ ๊ตฌํ
Java
// ์ฃผ์ฌ์๋ฅผ 3๋ฒ ๋์ ธ ๋ชจ๋ ๋ค๋ฅธ ์ ๋์ค๋ ๊ฒฝ์ฐ์ ์(๋์ง๋ ์์ ๊ณ ๋ ค)
class Permutation {
static int N=6, R=3;
static int[] dice; // ์ฃผ์ฌ์ ์ซ์
static int[] numbers; // ์์ด ๊ฒฝ์ฐ์ ์
static boolean[] isSelected; // ์ฃผ์ฌ์ ์ซ์ ํฌํจ ์ฌ๋ถ
public static void main(String[] args) {
dice = new int[] {1, 2, 3, 4, 5, 6};
numbers = new int[R];
isSelected = new boolean[N];
permutation(0);
}
private static void permutation(int depth) {
// ๊ธฐ์ ์กฐ๊ฑด - ์์ด ๋ฐฐ์ด์ ์ฃผ์ฌ์ 3๋ฒ ๋์ง๋งํผ์ด ์ ์ฅ๋๋ฉด~
if (depth == R) {
System.out.println(Arrays.toString(numbers));
return;
}
// ์ ๋ ํํธ - ํ์ฌ depth์ i๋ฒ์งธ ์ฃผ์ฌ์ ๊ฐ์ด ์ฌ ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ฅผ ์ ๋ถ ํ์ธ
for (int i=0; i<N; i++) {
if (isSelected[i]) continue;
numbers[depth] = dice[i];
isSelected[i] = true;
permutation(depth+1); // ๋ค์ depth๋ก ์ด๋
isSelected[i] = false;
}
}
}
์ค๋ณต ์์ด์ ์ฌ๊ท์ ๊ตฌํ
Java
// ์ฃผ์ฌ์๋ฅผ 3๋ฒ ๋์ ธ ๋์ค๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์(๋์ง๋ ์์ ๊ณ ๋ ค)
class PermutationWRepetition {
static int N=6, R=3;
static int[] dice; // ์ฃผ์ฌ์ ์ซ์
static int[] numbers; // ์์ด ๊ฒฝ์ฐ์ ์
public static void main(String[] args) {
dice = new int[] {1, 2, 3, 4, 5, 6};
numbers = new int[R];
permutationWRepetition(0);
}
private static void permutationWRepetition(int depth) {
// ๊ธฐ์ ์กฐ๊ฑด - ์์ด ๋ฐฐ์ด์ ์ฃผ์ฌ์ 3๋ฒ ๋์ง๋งํผ์ด ์ ์ฅ๋๋ฉด~
if (depth == R) {
System.out.println(Arrays.toString(numbers));
return;
}
// ์ ๋ ํํธ - ํ์ฌ depth์ i๋ฒ์งธ ์ฃผ์ฌ์ ๊ฐ์ด ์ฌ ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ฅผ ์ ๋ถ ํ์ธ
for (int i=0; i<N; i++) {
numbers[depth] = dice[i];
permutationWRepetition(depth+1);
}
}
}
์กฐํฉ
- ์๋ก ๋ค๋ฅธ ๊ฒ๋ค ์ค ๋ช ๊ฐ๋ฅผ ๋จ์ํ ๋ฝ๊ธฐ
O(nCr)
์ ์๊ฐ๋ณต์ก๋
์กฐํฉ์ ์ฌ๊ท์ ๊ตฌํ
Java
// ์ฃผ์ฌ์๋ฅผ 3๋ฒ ๋์ ธ ๋ชจ๋ ๋ค๋ฅธ ์ ๋์ค๋ ๊ฒฝ์ฐ์ ์(๋์ง๋ ์์ ๊ณ ๋ ค ์ํจ)
class Combination {
static int N=6, R=3;
static int[] dice; // ์ฃผ์ฌ์ ์ซ์
static int[] numbers; // ์กฐํฉ ๊ฒฝ์ฐ์ ์
public static void main(String[] args) {
dice = new int[] {1, 2, 3, 4, 5, 6};
numbers = new int[R];
combination(0, 0);
}
private static void combination(int depth, int startIdx) {
// ๊ธฐ์ ์กฐ๊ฑด - ์กฐํฉ ๋ฐฐ์ด์ ์ฃผ์ฌ์ 3๋ฒ ๋์ง๋งํผ์ด ์ ์ฅ๋๋ฉด~
if (depth == R) {
System.out.println(Arrays.toString(numbers));
return;
}
// ์ ๋ ํํธ - ์์ ์๊ด ์์ด ์ด๋ฏธ ๋ฝ์ ์ซ์๋ฅผ ์ ์ธํ๊ณ ๋ฝ์ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ ํ์ธ
for (int i=startIdx; i<N; i++){
numbers[depth] = dice[i];
combination(depth+1, i+1);
}
}
}
์ค๋ณต ์กฐํฉ์ ์ฌ๊ท์ ๊ตฌํ
Java
// ์ฃผ์ฌ์๋ฅผ 3๋ฒ ๋์ ธ ๋์ค๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์(๋์ง๋ ์์ ๊ณ ๋ ค ์ํจ)
class PermutationWRepetition {
static int N=6, R=3;
static int[] dice; // ์ฃผ์ฌ์ ์ซ์
static int[] numbers; // ์กฐํฉ ๊ฒฝ์ฐ์ ์
public static void main(String[] args) {
dice = new int[] {1, 2, 3, 4, 5, 6};
numbers = new int[R];
combinationWRepetition(0, 0);
}
private static void combinationWRepetition(int depth, int startIdx) {
// ๊ธฐ์ ์กฐ๊ฑด - ์กฐํฉ ๋ฐฐ์ด์ ์ฃผ์ฌ์ 3๋ฒ ๋์ง๋งํผ์ด ์ ์ฅ๋๋ฉด~
if (depth == R) {
System.out.println(Arrays.toString(numbers));
return;
}
// ์ ๋ ํํธ - ์์์ ์ซ์์ ์ค๋ณต ์๊ด ์์ด ๋ฝ์ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ ํ์ธ
for (int i=startIdx; i<N; i++) {
numbers[depth] = dice[i];
combinationWRepetition(depth+1, i);
}
}
}
๋ถ๋ถ ์งํฉ
- ์งํฉ์ ํฌํจ๋ ์์๋ค์ ์ ํ
- ์งํฉ ์์๊ฐ n๊ฐ์ผ ๋ ๊ณต์งํฉ์ ํฌํจํ ๋ถ๋ถ์งํฉ์ ๊ฐ์๋ 2^n๊ฐ
- ๊ฐ ์์๋ฅผ ๋ถ๋ถ ์งํฉ์ ํฌํจ์ํค๊ฑฐ๋ ํฌํจ์ํค์ง ์๊ฑฐ๋
O(2^n)
์ ์๊ฐ๋ณต์ก๋
๋ถ๋ถ ์งํฉ์ ์ฌ๊ท์ ๊ตฌํ
Java
class Subset {
static int N=5;
static int[] numbers; // ์งํฉ
static boolean[] isSelected; // ํด๋น ์์๋ฅผ ๋ถ๋ถ ์งํฉ ๊ฒฝ์ฐ์ ์์ ๋ฃ์๋์ง
public static void main(String[] args) {
numbers = new int[] {1, 2, 3, 4, 5};
isSelected = new boolean[N];
generateSubset(0)
}
private static void generateSubset(int idx) {
// ๊ธฐ์ ์กฐ๊ฑด - ๋ง์ง๋ง ์์๊น์ง ๋ถ๋ถ ์งํฉ์ ๋ฃ์์ง ๋ง์ง ๊ฒฐ์ ํ๋ค๋ฉด~(๋ถ๋ถ ์งํฉ ์์ฑ)
if (idx == N) {
for (int i=0; i<N; i++) {
System.out.print((isSelected[idx] ? numbers[idx] : "_") + " ");
}
System.out.println();
return;
}
// ์ ๋ ํํธ - ์งํฉ์ ์ฒซ๋ฒ์งธ ์์๋ถํฐ ๋ง์ง๋ง ์์๊น์ง ๋ฃ์ด๋ณด๊ณ ๋ฃ์ง ์์๋ด
// ํ์ฌ ์์ ๋ถ๋ถ ์งํฉ์ ๋ฃ์ ๊ฒฝ์ฐ
isSelected[idx] = true;
generateSubset(idx+1);
// ํ์ฌ ์์ ๋ถ๋ถ ์งํฉ์ ๋ฃ์ง ์์ ๊ฒฝ์ฐ
isSelected[idx] = false;
generateSubset(idx+1);
}
}