Next Permutation ๋ค์ ์์ด
ํ ์์ด์์ ์ฌ์ ์์ผ๋ก ๋ค์์ ์ฌ ์์ด์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
์๊ณ ๋ฆฌ์ฆ
- ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
- ๋ฐฐ์ด์ ๋งจ ๋ค ์์๋ถํฐ ํ์ํ์ฌ ์ต์ด๋ก ๊ฐ์ด ์์์ง๋ ์๊ฐ์ ์ธ๋ฑ์ค ์ฐพ๊ธฐ(
i
: ๊ผญ๋๊ธฐ, i ์ดํ๋ก ์ต์ด๋ก ๊ฐ์ด ์์์ง๋i-1
์ธ๋ฑ์ค๋ฅผ ํ๊ฒ์ผ๋ก ์ ์ ) - ๋ฐฐ์ด์ ๋งจ ๋ค ์์๋ถํฐ ํ์ํ์ฌ ํ๊ฒ ์์์ธ
i-1
์ดํ ์์๋ค ์ค, ํ๊ฒ ์์๋ณด๋ค ํฌ๋ ๊ฐ์ฅ ์์ ์์(j
)๋ฅผ ์ฐพ๊ธฐ i-1
์ธ๋ฑ์ค ์์์j
์ธ๋ฑ์ค ์์๋ฅผ ๊ตํ- ํ๊ฒ ์์ ์ดํ ๊ผญ๋๊ธฐ์ธ
i
์ธ๋ฑ์ค๋ถํฐ ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง์ ์์๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
Next Permutation์ ์ด์ฉํ ์์ด ๊ตฌํ
Java
public class NextPermutationTest {
public static void main(String[] args) {
int[] arr = {10, 5, 3, 7};
Arrays.sort(arr); // ์ค๋ฆ์ฐจ์ ์ ๋ ฌ(์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ์์ ์์ด)
// ์์์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ์ํ๊ฐ ์์ด์ ํ ๊ฒฝ์ฐ์ ์์ด๋ฏ๋ก ์์ด์ ์ด์ฉํ๋ ์์
์ํ ํ ์์ด ๋ง๋ค๊ธฐ ์งํ
do {
System.out.println(Arrays.toString(arr));
} while (nextPerm(arr));
}
// next permutation ๋ฉ์๋
private static boolean nextPerm(int[] arr) {
// ๊ผญ๋๊ธฐ ์ด์ ์ ์์ ๊ตฌํ๊ธฐ
int biggest = arr.length-1;
while (biggest>0 && arr[biggest-1] >= arr[biggest]) biggest--;
// ๊ผญ๋๊ธฐ ์์๊ฐ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ๋ผ๋ฉด ์ด๋ฏธ ๋ชจ๋ ์ ๋ ฌ๋ ์์ด์ด๋ฏ๋ก false ๋ฐํ
if (biggest == 0) return false;
// ๊ผญ๋๊ธฐ ์ด์ ์์์ ๊ตํํ ์์ ์ฐพ๊ธฐ. ๊ผญ๋๊ธฐ ์ดํ ์์๋ค ์ค ๊ผญ๋๊ธฐ ์ด์ ์์๋ณด๋ค ํฌ๋, ๊ฐ์ฅ ์์ ์์ ์ฐพ๊ธฐ
int swapTarget = arr.length-1;
while (arr[biggest-1] >= arr[swapTarget]) swapTarget--;
// ์์์ ์ฐพ์ ๋ ์์ ๊ตํ
swap(arr, biggest-1, swapTarget);
// ๊ผญ๋๊ธฐ๋ถํฐ ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง์ ์์๋ ๋ค์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
int smallest = arr.length-1;
while (smallest > biggest) {
swap(arr, biggest++, smallest--);
}
return true;
}
// ์์ 2๊ฐ ๊ตํ ๋ฉ์๋
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
์์ฉ - Next Permutation์ ์ด์ฉํ ์กฐํฉ ๊ตฌํ
Java
public class NextPermCombiTest {
public static void main(String[] args) {
int[] arr = {10, 5, 3, 7};
int N = arr.length, R = 3; // ๋ฐฐ์ด ์์ ์ค R๊ฐ ๋งํผ ๋ฝ์
int[] combi = new int[N]; // ์ ํํ ์์ ์ฒดํฌ ๋ฐฐ์ด
for (int i=N-1; i>=N-R; i--) combi[i] = 1; // ์ ํํ ์์ ์กฐํฉ(N๊ฐ ์ค R๊ฐ๋ง ์ฒดํฌ)์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ด๊ธฐํ
// ์์์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ์ํ๊ฐ ์กฐํฉ์ ํ ๊ฒฝ์ฐ์ ์์ด๋ฏ๋ก ์กฐํฉ์ ์ด์ฉํ๋ ์์
์ํ ํ ์กฐํฉ ๋ง๋ค๊ธฐ ์งํ
do {
// ์ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐํ์ผ๋ก ์กฐํฉ ๊ตฌ์ฑ
for (int i=0; i<N; i++){
if (combi[i] == 1) System.out.print(arr[i] + " ");
}
System.out.println();
} while (nextPerm(combi));
}
// ์์ด ์ฝ๋์ธ ์๋ ์ฝ๋๋ ์์ ํ์ง ์์๋ ์กฐํฉ ๊ตฌ์ฑ ๊ฐ๋ฅ!
// next permutation ๋ฉ์๋
private static boolean nextPerm(int[] arr) {
// ๊ผญ๋๊ธฐ ์ด์ ์ ์์ ๊ตฌํ๊ธฐ
int biggest = arr.length-1;
while (biggest>0 && arr[biggest-1] >= arr[biggest]) biggest--;
// ๊ผญ๋๊ธฐ ์์๊ฐ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ๋ผ๋ฉด ์ด๋ฏธ ๋ชจ๋ ์ ๋ ฌ๋ ์์ด์ด๋ฏ๋ก false ๋ฐํ
if (biggest == 0) return false;
// ๊ผญ๋๊ธฐ ์ด์ ์์์ ๊ตํํ ์์ ์ฐพ๊ธฐ. ๊ผญ๋๊ธฐ ์ดํ ์์๋ค ์ค ๊ผญ๋๊ธฐ ์ด์ ์์๋ณด๋ค ํฌ๋, ๊ฐ์ฅ ์์ ์์ ์ฐพ๊ธฐ
int swapTarget = arr.length-1;
while (arr[biggest-1] >= arr[swapTarget]) swapTarget--;
// ์์์ ์ฐพ์ ๋ ์์ ๊ตํ
swap(arr, biggest-1, swapTarget);
// ๊ผญ๋๊ธฐ๋ถํฐ ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง์ ์์๋ ๋ค์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
int smallest = arr.length-1;
while (smallest > biggest) {
swap(arr, biggest++, smallest--);
}
return true;
}
// ์์ 2๊ฐ ๊ตํ ๋ฉ์๋
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}