- flag๋ฅผ Next Permutation์ ์ด์ฉํ์ฌ ๊ตฌํํ ๊ฒ
- nCr ์ ๊ตฌํ๊ณ ์ ํ ๋, ํฌ๊ธฐ n์ ๋ฐฐ์ด์ ์์ฑํ์ฌ r ๊ฐ์ ํฌ๊ธฐ๋งํผ 0 ์ด ์๋ ๊ฐ ์ด๊ธฐํ
5C2 ์ด๋ฉด, 00011 ๋ก ์ด๊ธฐํ
- Next Permutation ์๊ณ ๋ฆฌ์ฆ ์ด์ฉ
00011์ ์ฌ์ฉํ์ฌ NP๋ฅผ ๋๋ฆฌ๊ณ 1์ ์์น์ ์์ ๊ฐ์ด ์ ํ๋์ด ์กฐํฉ์ ๋ง๋ ๋ค.
- Next Permutation ํ ๋ฒ ์ด์ฉํ ๋๋ง๋ค ์กฐํฉ์ด ๋ง๋ค์ด ์ง๋ค. (0์ด ์๋ ๊ฐ์ ์์น๊ฐ ๋ณ๊ฒฝ๋๋ค)
=> r๊ฐ์ ํฌ๊ธฐ ๋งํผ, ์ฆ, 0์ด ์๋ ๊ฐ์ด ์ธํ ๋ ๊ณณ์ ์์๋ฅผ ์ ํํ์ฌ ์กฐํฉ์ ๋ง๋ ๊ฒ์ด๋ค.
import java.util.Arrays;
public class Combination {
static int N, R, nums[];
public static void main(String[] args) {
// nCr
R = 3;
N = 5;
nums = new int[] { 1, 2, 3, 4, 5 };
int[] set = new int[N];
// 0๋ณด๋ค ํฐ ๊ฐ์ผ๋ก R๊ฐ๋ฅผ ๋งจ ๋ค๋ถํฐ ์ฑ์ด๋ค.
int cnt = 0;
while (++cnt <= R)
set[cnt] = 1;
Arrays.sort(set); // ์ค๋ฆ์ฐจ์์ผ๋ก ๋ง๋ค๊ธฐ ์ํด์
do {
for(int i = 0; i < N; i++) {
if(set[i] == 1) {
System.out.print(nums[i]+" ");
}
}
System.out.println();
} while (nextPermutation(set));
}
// 2. ๊ผญ๋๊ธฐ๋ฅผ ์ฐพ์์ ์์ด ๋ง๋ค๊ธฐ
private static boolean nextPermutation(int[] set) {
// 1) ๊ผญ๋๊ธฐ ์ฐพ๊ธฐ
int i = N - 1;
while (i > 0 && set[i - 1] >= set[i])
--i;
// i==0์ด๋ฉด, ๋ง๋ค ์ ์๋ ํํ์ ์์ด์ด ๋์ด์ ์๋ค๋ ๋ป (๋ง๋ค ์ ์๋ ๊ฐ์ฅ ํฐ ์์ด์ ๋ค ๋ง๋ค์๋ค)
if (i == 0)
return false;
// 2) ๊ตํ ์์น์ ๊ตํํ ๊ฐ ์ฐพ๊ธฐ
int j = N - 1;
while (set[i - 1] >= set[j])
--j;
// 3) ๊ตํํ ์์น์ ๊ตํํ ์์น๋ณด๋ค ํฐ ๊ฐ ๋ฐ๊พธ๊ธฐ
swap(set, i - 1, j);
// 4) ๊ผญ๋๊ธฐ๋ถํฐ ๋งจ ๋ค๊น์ง ์ค๋ฆ ์ฐจ์ ์ ๋ ฌ
int k = N - 1;
while (i < k) {
swap(set, i++, k--);
}
return true;
}
private static void swap(int[] set, int i, int j) {
int temp = set[i];
set[i] = set[j];
set[j] = temp;
}
}
'Algorithm > ์ด๋ก ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Next Permutation์ ์ด์ฉํ ์์ด (0) | 2022.05.17 |
---|---|
๋นํธ๋ง์คํน์ ์ด์ฉํ ์์ด, ์กฐํฉ (0) | 2022.05.17 |
๋๊ธ