Algorithm/μ΄λ‘
Next Permutationμ μ΄μ©ν μ‘°ν©
Edlin
2022. 5. 17. 21:50
- 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;
}
}