Algorithm/μ΄λ‘
Next Permutationμ μ΄μ©ν μμ΄
Edlin
2022. 5. 17. 21:54
- λ°°μ΄μ μ€λ¦μ°¨μ μ λ ¬ν λ€, μ¬μ μμΌλ‘ λ€μ μμ΄μ μμ±νλ λ°©λ²
μ μ°¨
- λ°°μ΄μ μ€λ¦μ°¨μμΌλ‘ μ λ ¬
- λ€μμ΄ κ³Όμ μ λ°λ³΅νμ¬ μμ΄ μμ± (κ°μ₯ ν° λ΄λ¦Όμ°¨μ μμ΄μ λ§λ€ λκΉμ§ λ°λ³΅)
- λ€μͺ½λΆν° νμνμ¬ κ΅νμμΉ(κΌλκΈ° λ°λ‘ μ§μ ) μ°ΎκΈ° (κΌλκΈ° - κ°μ₯ ν° μ)
- λ€μͺ½λΆν° νμνμ¬ κ΅νμμΉμ(κΌλκΈ° λ°λ‘ μ§μ ) κ΅νν ν° κ° μμΉ μ°ΎκΈ° (κ΅νμμΉλ³΄λ€ ν° μ μ€ κ°μ₯ κ°κΉμ΄ μ)
- λ μμΉ κ° κ΅ν
- κΌλκΈ°λΆν° 맨 λ€κΉμ§ μ€λ¦μ°¨μ μ λ ¬
ex. 1 2 3 -> 3 2 1 κΉμ§ λ§λλ κ³Όμ
import java.util.Arrays;
public class NextPermutation {
static int R, N, nums[], set[];
public static void main(String[] args) {
// nPn
N = 4;
nums = new int[] { 1, 2, 4, 3, 5};
set = new int[R]; // μ‘°ν©μ λ§λ€μμ λμ μ§ν©
// 1. μ€λ¦μ°¨μ μ λ ¬
Arrays.sort(nums);
do {
System.out.println(Arrays.toString(nums));
}while(nextPermutation());
}
// 2. κΌλκΈ°λ₯Ό μ°Ύμμ μμ΄ λ§λ€κΈ°
private static boolean nextPermutation() {
// 1) κΌλκΈ° μ°ΎκΈ°
int i = N - 1;
while (i > 0 && nums[i - 1] >= nums[i])
--i;
// i==0μ΄λ©΄, λ§λ€ μ μλ ννμ μμ΄μ΄ λμ΄μ μλ€λ λ» (λ§λ€ μ μλ κ°μ₯ ν° μμ΄μ λ€ λ§λ€μλ€)
if (i == 0)
return false;
// 2) κ΅ν μμΉμ κ΅νν κ° μ°ΎκΈ°
int j = N - 1;
while (nums[i - 1] >= nums[j])
--j;
// 3) κ΅νν μμΉμ κ΅νν μμΉλ³΄λ€ ν° κ° λ°κΎΈκΈ°
swap(i - 1, j);
// 4) κΌλκΈ°λΆν° 맨 λ€κΉμ§ μ€λ¦ μ°¨μ μ λ ¬
int k = N - 1;
while (i < k) {
swap(i++, k--);
}
return true;
}
private static void swap(int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}