0. ์ค๋ช ํ๋ ค๋ ๊ฒ
(1) ์์ด, ์กฐํฉ, ์ค๋ณต ์์ด, ์ค๋ณต ์กฐํฉ์ ์ ์
(2) JAVA ์ธ์ด๋ฅผ ์ผ์ ๋, ๊ตฌํ ๋ฐฉ๋ฒ
1. ์์ด
(1) ์์ด์ ๋ป
nPr = n ๊ฐ ์ค์์ r๊ฐ๋ฅผ ์ค๋ณต ์์ด ๋ฝ์์ ์์ ์๊ฒ ๋์ดํ๋ ๊ฒ์ ๋งํ๋ค. ๋ฐ๋ผ์ {1, 2, 3, 4, 5} ์ค 5P3 ์์ {1, 2, 3} ๊ณผ {1, 3, 2}๋ ๋ค๋ฅธ ์ซ์์ด๋ค.
(2) ๊ตฌํ ๋ฐฉ๋ฒ
์์ด์ ์ฌ๊ท๋ก ๊ตฌํํ๋ค. ์์ด์ ์ฌ๊ท๋ก ๊ตฌํํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ์์๋ค์ด ํ์ํ๋ค.
- ์ ์ฒด ์์๋ค์ ๋ํ ๋ฐฉ๋ฌธ ๋ฐฐ์ด isVisited [] : ์์ด๋ก ๊ฐ์ ๋ฝ์ ๋, ์ค๋ณต์ด ์์ด์ผ ํ๋ฏ๋ก, ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ ํตํด, ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ง์ ์ ๊ทธ๋ฅ ์ง๋์น๋๋ก ๊ตฌํ ํด์ผ ํ๋ค.
- ๋ฝํ r๊ฐ์ ์์๋ฅผ ๋ด์ ๋ฐฐ์ด output [] : ์ ์ฒด ์์๊ฐ ๋ด๊ธด ๋ฐฐ์ด์ arr ์ด๋ผ ํ์ ๋, ๋ฝํ ์์๋ง ๋ด์ ๋ฐฐ์ด output ๋ํ ํ์ํ๋ค.
- depth ๋ณ์ : ์ฌ๊ท๊ฐ ๋ช ๋ฒ์งธ ๊น์ด์ธ์ง ๋ํ๋ด๋ ๋ณ์์ด๋ค. ํด๋น ๋ณ์๊ฐ ๋ฐ๋ก output ๋ฐฐ์ด์ ์์๋ฅผ ๋์ ํด์ผํ ์์น์ด๋ค.
- ๊ธฐ์ ์กฐ๊ฑด : output์ nPr ์ค r์ ํฌ๊ธฐ๋ฅผ ๋์ด์ฐ์ ๊ฒฝ์ฐ, (depth๊ฐ r์ผ ๊ฒฝ์ฐ), ๋ ์ด์, ์์๋ฅผ n๊ฐ ์ค์ ๊ณ ๋ฅด๋ ์ฐ์ฐ์ ๊ทธ๋งํ๊ณ , ๋ฌธ์ ์์ ์ํ๋ ์ฐ์ฐ์ ํ๋๋ก ํ๋ ๊ธฐ์ ์กฐ๊ฑด์ด ํ์ํ๋ค. ๊ธฐ์ ์กฐ๊ฑด ์ํ ํ์๋ ์ด์ ์ฌ๊ท๋ก ๋์๊ฐ์ผ ํ๋ค. ๋ฐ๋ผ์ ๋งจ ๋ง์ง๋ง์ return์ ์จ์ค์ผ ํ๋ค.
๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- depth < r ์ผ ๋,
- arr[i]๊ฐ ๋ฏธ๋ฐฉ๋ฌธํ ์ง์ ์ผ ๊ฒฝ์ฐ, arr[i]๋ฅผ ๋ฐฉ๋ฌธ์ผ๋ก ์ฒดํฌํ๋ค. output[depth] = arr[i]๋ฅผ ์ง์ด๋ฃ๊ณ , depth+1 ์ ์ฌ๊ท๋ก ๋ค์ด๊ฐ๋ค.
- arr[i]๊ฐ ๋ฐฉ๋ฌธํ ์ง์ ์ผ ๊ฒฝ์ฐ, for ๋ฌธ์ ํตํด arr[i+1]์ด ๋ฏธ๋ฐฉ๋ฌธ์ธ์ง ๋ฐฉ๋ฌธ์ธ์ง ํ์ธํ๋ค.
- (i)๋ฒ์ ์ฌ๊ท๊ฐ ๋๋๊ณ ๋ฐํ ๋์์ ๊ฒฝ์ฐ, output[depth] = arr[i] ์ธ ๊ฒฝ์ฐ์ ์๋ ๋ค ๋ณธ ๊ฒ์ด๋ค. ์ด์ for ๋ฌธ์ ๋๋ ค์ output[depth] = arr[i+1]์ธ ๊ฒฝ์ฐ๋ฅผ ํ์ธํ๋ค.
- depth == r ์ผ ๋,
- ์ง๊ธ๊น์ง ๋ฝ์ ์๋ค์ nPr์ ์ถฉ์กฑํ๋ค. ํด๋น ๊ฐ๋ค๋ก ๋ฌธ์ ๊ฐ ์ํ๋ ์ฐ์ฐ์ ํ๋ค.
(3) ์ฝ๋๋ถ์
// โญ 1๋ฒ: ์์ด
// ์์ด์ด๋? : nPr = n ๊ฐ ์ค r๊ฐ๋ฅผ ์ค๋ณต ์์ด ๋ฝ์์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ๋์ด ํ๋ ๊ฒ
// ์์๋ฅผ ๊ณ ๋ คํ๋ค. => 1 3 2 ์ 1 2 3์ ์๋ก ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์์ด๋ค.
/* 1. arr[] : ์๋ณธ ๋ฐฐ์ด
* 2. output[] : ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋ฐฐ์ด
* 3. visited[]: ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ฒดํฌ
* 4. depth : ํ์ฌ๊น์ง ๋ฝ์ ์์ ๊ฐ์
* 5. r : ์ด ๋ฝ์์ผ ํ๋ ์์ ๊ฐ์
*/
public static void permutation(int [] arr, int [] output, boolean [] visited, int depth, int r) {
// 1. ๊ธฐ์ ์กฐ๊ฑด (depth ๊ฐ r ์ด ๋๋ฉด, ๊ฐ์ ์ ๋ถ ๋ฝ์์ ์ผ๋ ฌ๋ก ๋์ดํ ๊ฒ์ด๋ฏ๋ก, ๋ฌธ์ ์์ ์ํ๋ ํ๋์ ํํ๋ค.)
// 0๋ถํฐ ์
๊ธฐ ๋๋ฌธ์ depth == r์ด๋ ์๋ฆฌ๋ ๋ชจ๋ ์ธ๊ณ +1 ํด์ ์๋ ์ธ์ผํ ์๋ฅผ ๋์ด์ฐ๋ค๋ ๋ป์ด๋ค.
// ๋ฐ๋ผ์ ์ฌ๊ธฐ์๋ ์๋ ํํ๋ 'N๊ฐ ์ค r ๋ฝ์์ ์ผ๋ ฌ๋ก ๋์ด' ๊ณ์ฐ์ ํ์ง ์๊ณ , ์กฐ๊ฑด ์ถฉ์กฑ ์ ํด์ผํ ๊ณ์ฐ์ ํํ๋ค.
if(depth == r){
for(int temp: output){
if(temp == 0) {
continue;
}
System.out.print(temp + " ");
}
System.out.println();
// 1-1) ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์๋ฅผ ๋๋ฌ๋ณด๊ธฐ ์ํด ์ด์ ์ฌ๊ท๋ก ๋์๊ฐ๋ค.
return;
}
// 2. nPr ์คํ
for (int i = 0; i < arr.length; i++) {
// ์ค๋ณต์ด ์์ด์ผ ํ๋ฏ๋ก, ๋ฐฉ๋ฌธ ํ์ผ๋ฉด ๊ณ ๋ คํ์ง ์๊ณ ๋ค์์ผ๋ก ๋์ด๊ฐ๋ค.
if(!visited[i]){
visited[i] = true;
// nPr์ ํ์ฌ ์๋ฆฌ ์ = ๋ฐฉ๋ฌธํ์ง ์์ ๊ฐ์ ๋ฃ์
output[depth] = arr[i];
// ๋ค์ ์๋ฅผ ์ธ๋ฌ ๋์ด๊ฐ๋ค.
permutation(arr,output,visited, depth+1, r);
// output[1] = 1, output[2] = 5 ๋ผ๊ณ ํ๊ณ , ํ depth = 2, i = 5 ๋ผ๊ณ ํ์.
// ์ฌ๊ท๋ฅผ ๋๋ด๊ณ ๋์์๋ค๋ ๊ฒ์ {1,5, ...} ์ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด๊ณ ์๋ค๋ ๊ฒ์ด๋ค.
// ๋ฐ๋ผ์ i = 5๋ ๋ค๋ฅธ ์์น์์ ๊ฒฝ์ฐ์ ์๋ฅผ ์
๋ ํ์ํ๋ฏ๋ก, ๋ฏธ๋ฐฉ๋ฌธ์ผ๋ก ์ ํํ๋ค.
visited[i] = false;
}
// ์ด์ loop๊ฐ ๋ค์์ผ๋ก ๋์ด๊ฐ ๊ฒ์ด๊ณ , depth = 2์์ i = 6์ธ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ณผ ๊ฒ์ด๋ค.
}
}
2. ์กฐํฉ
(1) ์กฐํฉ์ ์ ์
nCr์ด๋ n๊ฐ ์ค์์ r๊ฐ๋ฅผ ๋ฝ๋ ๊ฒฝ์ฐ์ ์์ด๋ค. ์์ด๊ณผ์ ์ฐจ์ด์ ์ nCr์ ๊ฒฝ์ฐ, ์์๋ฅผ ๊ณ ๋ คํ์ง ์๋๋ค๋ ์ ์ด๋ค.
(2) ๊ตฌํ ๋ฐฉ๋ฒ
์์ด๊ณผ ๋ค๋ฅด๊ฒ ์ธ์๋ก start ๋ณ์๋ฅผ ๋๋ค. **start ๋ณ์**๋ ํด๋น index ์ง์ ๋ถํฐ ์ซ์๋ฅผ ๊ณ ๋ฅด๋๋ก ํ๋ ๋ณ์์ด๋ค. ํด๋น ๋ณ์๊ฐ ํ์ํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค. {1, 2, 3, 4, 5}์์, 5C3์ ๊ตฌํด๋ณด์. ๋ง์ฝ 1๋ถํฐ ์์ํ์ฌ 3๊ฐ๋ฅผ ๊ณจ๋์ ๊ฒฝ์ฐ, 1,2,3 1,2,4 .... 1,4,5 ์ ๋๊ฐ ๋ ๊ฒ์ด๋ค. ๋ค์ 2๋ถํฐ ์์ํ์ฌ 3๊ฐ๋ฅผ ๊ณจ๋ผ๋ณด์. 2,1,3 ์ด ๊ฐ๋ฅํ ์ซ์์ธ๊ฐ? ์๋๋ค. ์๋ํ๋ฉด 1์ ์ ๋ ์ ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ฒ๋ผ, **1๋ถํฐ ์์ํ์ฌ ๊ทธ๋ณด๋ค ํฐ ์ ์ค์ ๋จ์ 2๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์ ์๊ฐ ์ด๋ฏธ 1๊ณผ 2 ๋ฅผ ๊ณจ๋์ ๋ ๋์ฌ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํฌํจํ๊ณ ์๋ค!** ๋ฐ๋ผ์, 2๋ถํฐ ์ ๋๋ 1์ ๊ณ ๋ คํ์ง ๋ง๊ณ 2๋ณด๋ค ํฐ 3๋ถํฐ ๋๊น์ง์ ์๋ฅผ ๊ณ ๋ฅด๋ฉด ๋๋ค. ์ด๋ 3๋ถํฐ ์์ํ ๋, 4๋ถํฐ ์์ํ ๋, 5๋ถํฐ ์์ํ ๋, ๋ชจ๋ ๊ฐ๋ค.
(3) ์ฝ๋ ๋ถ์
// โญ 2๋ฒ: ์กฐํฉ
/*
* 1) ์์ด๊ณผ ๋ค๋ฅธ ์
* ์์ด๊ณผ ๋ค๋ฅด๊ฒ, ์กฐํฉ์ start ๋ณ์๋ฅผ ๋๋ค.
* start ๋ณ์๋ ์กฐํฉ์ ํฌํจํ ๊ฐ์ ์ฐพ๋ ํ์๋ฅผ ์์ํด์ผํ ์ง์ ์ด๋ค.
*
* ์ ์ด๋ฐ๊ฐ?
* ์กฐํฉ์ ์์๋ฅผ ๊ณ ๋ คํ์ง ์๋๋ค.
* ์๋ฅผ ๋ค์ด {1,2,3,4,5,6}์ ๋ฐฐ์ด์ ๊ดํ์ฌ 6C3์ ๊ตฌํ๋ค๊ณ ํ์.
* ์ฒ์ 1์ ํฌํจํ์ฌ 3๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ์์์ 2๋ฅผ ํฌํจํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์, 3์ ํฌํจํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ค ๊ตฌํ๋ค.
* ๋ฐ๋ผ์ ๊ทธ ํ 2๋ฅผ ํฌํจํ์ฌ 3๊ฐ ๊ณ ๋ฅด๋ ์์์ 1์ ํฌํจํ๋ ๊ฒฝ์ฐ๋ ์ด๋ฏธ ์ ์ ๋ชจ๋ ๊ณ์ฐํ๊ธฐ์ ํฌํจํ ํ์๊ฐ ์๋ค.
*
* arr = ์ด ๋ฐฐ์ด, output = ์ด ๋ฐฐ์ด์์ r ๊ฐ ์ค๋ณต์์ด ์ ํํ ์๊ฐ ๋ค์ด์๋ ๋ฐฐ์ด
* start = ์ ํ์ ์์์ depth = ์ง๊ธ๊น์ง ์ ํํ ์์ ๊ฐ์
* r = ์ด ์ ํํด์ผํ ์์ ๊ฐ์
* */
public static void Combination (int [] arr, int [] output, int start, int depth, int r ) {
// 1) ๊ธฐ์ ์กฐ๊ฑด
if(depth == r){
for(int temp: output){
if (temp == 0) {
continue;
}
System.out.print(temp + " ");
}
System.out.println();
return;
}
// 2) nCr ๊ณ์ฐ
for (int i = start; i < arr.length; i++) {
output[depth] = arr[i];
Combination(arr,output,i+1, depth+1, r);
}
}
3. ์ค๋ณต ์์ด
(1) ์ ์
n๊ฐ ์ค์ ์ค๋ณต์ด ๊ฐ๋ฅํ r๊ฐ๋ฅผ ๋ฝ์์ ์์ ์๊ฒ ๋์ดํ๋ ๊ฒ์ ๋งํ๋ค.
(2) ๊ตฌํ ๋ฐฉ๋ฒ
์์ด์ ๊ตฌํํ ๋, ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ด ์ ํ์ ํ๋๊ฐ? ์ด์ ๋, ์ค๋ณต์ ์ ๊ฑฐํ๊ธฐ ์ํจ์ด์๋ค. ์ด์ ์ค๋ณต์ด ํ์ฉ๋๋ฏ๋ก ํด๋น ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ด ํ์ ์์ด์ก๋ค. ๋ฐ๋ผ์ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ๋ค.
- depth < r ์ผ ๋, ๋ฐฉ๋ฌธ ํ๋์ง ์ฌ๋ถ ์๊ด ์์ด output[depth] = arr[i]๋ฅผ ์ง์ด๋ฃ๋๋ค. ์ด์งํผ 1,1,1,1,1 ์ด ๋๋ฉด 1๋ก๋ง ํ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ดค์ผ๋ฏ๋ก, ์ ์ผ ๊น์ํ depth์ for ๋ฌธ์ด ๋ค์ ๊ฐ์ผ๋ก ๋์ด๊ฐ๋ค. ๋ฐ๋ผ์ 1,1,1,1,2 ๊ฐ ๋๋ค.
- depth == r ์ผ ๋, ์ด์ ๋ฌธ์ ์์ ์ํ๋ ์ผ์ ํ๋ฉด ๋๋ค.
(3) ์ฝ๋ ๋ถ์
// โญ 3๋ฒ: ์ค๋ณต ์์ด
/*
* 1) ์์ด๊ณผ์ ์ฐจ์ด์ :
* ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ด ๋ ์ด์ ํ์ ์๋ค. -> ๊ฐ์ ์๋ ์ธ์ด์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ๋์ดํ๋ฉด ๋๋ค.
* ๊ฐ์ ์ ์ธ๋ ๊ฒฝ์ฐ ๋ค ์ธ๋ฉด for ๋ฌธ์ด ์๋์ผ๋ก ๊ทธ ๋ค์ ์๋ฅผ ๊ณ ๋ ค ํ ๊ฒ์ด๋ค.
* ์๋ฅผ ๋ค์ด 5ใ
5 ๋ฅผ ๊ตฌํ๋ ๊ฒฝ์ฐ,
* 1,1,1,1,1 ๋ค ์ธ๋ฉด ์๋์ผ๋ก 5๋ฒ์งธ depth์ ํฌ๋ฌธ์ด ์๋์ผ๋ก 2๋ก ๋์ด๊ฐ์
* 1,1,1,1,2 ๊ฐ ์ธ์ด์ง๋ค. ์ด๊ฒ์ ์ด์ฉํ๋ฉด ๋๋ค.
*
*
* arr = ํ๊ฒ ๋ฐฐ์ด, output = ์ค๋ณต ์์ด ์ธ๋ฉด์ ๋ด์ ๊ฐ๋ค(๋ชจ๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋ด๊ธด๋ค.)
* depth = ํ์ฌ๊น์ง ๋ฝ์ ์์ ๊ฐ์ r = ์ด ๋ฝ์์ผ ํ ๊ฐ์
* */
public static void RepeatablePermutation (int [] arr, int [] output, int depth, int r ) {
// 1) ๊ธฐ์ ์กฐ๊ฑด
if(depth == r) {
for(int temp : output){
if(temp == 0) {continue;}
System.out.print( temp + " ");
}
System.out.println();
return;
}
for (int i = 0; i < arr.length; i++) {
output[depth] = arr[i];
RepeatablePermutation(arr,output,depth+1, r);
}
}
4. ์ค๋ณต ์กฐํฉ
(1) ์ ์
์ค๋ณต์ด ๊ฐ๋ฅํ๊ฒ n๊ฐ ์ค r๊ฐ๋ฅผ ๋ฝ๋ ๊ฒฝ์ฐ์ ์
(2) ๊ตฌํ ๋ฐฉ๋ฒ
n๊ฐ ์ค ์ค๋ณต ๋๊ฒ r๊ฐ๋ฅผ ๋ฝ์ผ๋ฉด ๋๋ค. ์์ ์กฐํฉ์์ ๋ณด๋ฉด ๋ค์ ์ฌ๊ท๋ก ๊ฐ ๋, start ์ธ์์๋ i+1์ด๋ ๊ฐ์ ์ง์ด๋ฃ์๋ค. ๊ทธ ์ด์ ๋ ๊ฐ์ ๊ฐ๋ถํฐ ์์ํ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํจ์ด์๋ค. ๊ทผ๋ฐ ์ด์ ๋ค์ depth์์๋ ๊ฐ์ ๊ฐ๋ถํฐ ์์ํด๋ ๋๋ค. ์๋ํ๋ฉด ์ค๋ณต์ด ํ์ฉ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
(3) ์ฝ๋ ๋ถ์
// โญ 4๋ฒ: ์ค๋ณต ์กฐํฉ
// ์กฐํฉ๊ณผ ๋ค๋ฅธ ์ : ์๊ธฐ ์์ ๋ ์ ํํ ์ ์์ผ๋ฏ๋ก, start๋ฅผ i+1์ด ์๋ i ์์ฒด๋ก ๋ค์ ์ฌ๊ท์ ๋๊ฒจ์ค๋ค.
public static void RepeatableCombination (int [] arr, int [] output, int start, int depth, int r) {
// 1) ๊ธฐ์ ์กฐ๊ฑด
if(depth == r) {
for (int temp : output){
if(temp == 0) {continue;}
System.out.print(temp + " ");
}
System.out.println();
return;
}
for (int i = start; i < arr.length; i++) {
output[depth] = arr[i];
RepeatableCombination(arr,output,i,depth+1, r);
}
}