1. ์์ด Permutation
- ๊ธธ์ด๊ฐ n๊ฐ์ธ ๋ฐฐ์ด์์ r๊ฐ์ ์์๋ฅผ ์ฐจ๋ก๋ก ๋ฝ์ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ค์์ ๋ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฐฐ์ด(์ค๋ณต์ ์ธ)
→ ์์ด, ์ค๋ณต ์์ด, ์กฐํฉ, ์ค๋ณต์กฐํฉ ๋ชจ๋ n๊ฐ์์ r๊ฐ๋ฅผ ๋ฝ๋๋ค๋ ์ ์์ ๋์ผ
- ์์ด์ ์ ์์์๋ ์ ๋ ฌ. ์์๊ฐ ์๋ค๋ ๊ฒ์ด ํน์ง
public class AlgorithmStudy {
public static void permutation(int[] arr, int[] out, boolean[] visited, int depth, int r){
if(depth == r){
for(int num: out) System.out.print(num);
System.out.println();
return;
}
for(int i=0; i<arr.length; i++){
if(!visited[i]){
visited[i] = true;
out[depth] = arr[i];
permutation(arr, out, visited, depth+1, r);
visited[i] = false;
}
}
}
public static void main(String[] args){
int[] arr = {1, 2, 3};
int r = 2;
permutation(arr, new int[r], new boolean[arr.length], 0, r);
}
}
→ ๊ฒฐ๊ณผ : 1 2 / 1 3 / 2 1 / 2 3 / 3 1 / 3 2
2. ์ค๋ณต ์์ด
- ์๋ก ๋ค๋ฅธ n๊ฐ์์ ์ค๋ณต์ด ๊ฐ๋ฅํ๊ฒ r๊ฐ๋ฅผ ๋ฝ์์ ์ ๋ ฌํ๋ ๊ฒฝ์ฐ์ ์
- ์์๊ฐ ์๋ค๋ ์ ์์ ์์ด๊ณผ ๋์ผ. ๊ฐ์ ์์๋ฅผ ์ค๋ณตํด์ ๋ฝ์ ์ ์๋ค๋ ์ ์์ ์ฐจ์ด
→ ์์ด ์ฝ๋์์ ์ค๋ณต๋ฐฉ์ง๋ฅผ ์ํด ์ฌ์ฉํ๋ visited ๋ถ๋ถ์ ์ ๊ฑฐํ๋ฉด ๋๋ค.
public class AlgorithmStudy {
public static void permutation(int[] arr, int[] out, int depth, int r){
if(depth == r){
for(int num: out) System.out.print(num);
System.out.println();
return;
}
for(int i=0; i<arr.length; i++){
out[depth] = arr[i];
permutation(arr, out, depth+1, r);
}
}
public static void main(String[] args){
int[] arr = {1, 2, 3};
int r = 2;
permutation(arr, new int[r], 0, r);
}
}
→ ๊ฒฐ๊ณผ : 1 1 / 1 2 / 1 3 / 2 1 / 2 2 / 2 3 / 3 1 / 3 2 / 3 3
3. ์กฐํฉ Combination
- ์๋ก ๋ค๋ฅธ n๊ฐ์์ ์์ ์์ด r๊ฐ๋ฅผ ๋ฝ๋ ๊ฒฝ์ฐ์ ์(์ค๋ณต์ ์ธ)
→[1, 2] ์ [2, 1]์ ๊ฐ์ ๊ฒ์ผ๋ก ์ทจ๊ธ โท ์ด ๊ฒฝ์ฐ [1, 2]๋ง ์นด์ดํ
- ์์ ์๊ด์ด ์๊ณ , ์ค๋ณต๋ ์๊ธฐ ๋๋ฌธ์ ์ ํ๋ ์์๋ฅผ ๋ฐ๋ก ์ ์ฅํ์ง ์๊ณ ,
์์๋ค๊ณผ visited๋ง ์ด์ฉํ์ฌ ๋ฐฉ๋ฌธํ ์์๋ค์ ์์๋๋ก ํ์ธํ๋ฉด ๊ณง ์ ํ๋ ์กฐํฉ
public class AlgorithmStudy {
public static void combination(int[] arr, boolean[] visited, int start, int depth, int r){
if(depth == r){
for(int i=0; i<arr.length; i++){
if(visited[i]) System.out.print(arr[i]);
}
System.out.println();
return;
}
for(int i=start; i<arr.length; i++){
if(!visited[i]){
visited[i] = true;
combination(arr, visited, i+1, depth+1, r);
visited[i] = false;
}
}
}
public static void main(String[] args){
int[] arr = {1, 2, 3};
int r = 2;
combination(arr, new boolean[arr.length], 0, 0, r);
}
}
→ ๊ฒฐ๊ณผ : 1 2 / 1 3 / 2 3
4. ์ค๋ณต ์กฐํฉ
- ์๋ก ๋ค๋ฅธ n๊ฐ์์ ์์ ์์ด, ์ค๋ณต์ด ๊ฐ๋ฅํ๊ฒ r๊ฐ๋ฅผ ๋ฝ๋ ๊ฒฝ์ฐ์ ์
- ์์ ์์ด ๋ฝ๋ ์กฐํฉ๊ณผ ๋์ผํ์ง๋ง, ์ค๋ณต์ด ๊ฐ๋ฅํ๋ค๋ ์ ์์ ์ฐจ์ด(์ฆ, ์ด๋ฏธ ๋ฝ์ ๊ฒ์ ๋ ๋ฝ์ ์ ์์)
→ ์กฐํฉ ์ฝ๋์์ ์ค๋ณต๋ฐฉ์ง๋ฅผ ์ํด์ฌ์ฉํ๋ visited ๋ถ๋ถ์ ์ ๊ฑฐํ๋ฉด ๋๋ค.
→ ์ค๋ณต์ด ๊ฐ๋ฅํ๋ฏ๋ก ์ ํํ ์์๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด ํ์
public class AlgorithmStudy {
public static void combination(int[] arr, int[] out, int start, int depth, int r){
if(depth == r){
for(int num : out) System.out.print(num);
System.out.println();
return;
}
for(int i=start; i<arr.length; i++){
out[depth] = arr[i];
combination(arr, out, i, depth+1, r);
}
}
public static void main(String[] args){
int[] arr = {1, 2, 3};
int r = 2;
combination(arr, new int[r], 0, 0, r);
}
}
๊ฒฐ๊ณผ → 1 1 / 1 2 / 1 3 / 2 2 / 2 3 / 3 3