Algorithm/기타

순열 (PERMUTATION) - 사전순

밤이2209 2017. 4. 8. 07:58

순열 (PERMUTATION) - 사전순


이전 글 : 순열 (PERMUTATION)  http://stack07142.tistory.com/24

순열을 사전순으로 만들려면 어떻게 해야 할까

[1, 2, 3, 4] 순열이 있을 때,
---------------------------------------------------------
[1, 2, 3, 4]

[1,     2, 3, 4]
[2,     1, 3, 4]
[3,     1, 2, 4]
[4,     1, 2, 3]
---------------------------------------------------------
[1,     2, 3, 4]
[1,     2,     3, 4]
[1,     3,     2, 4]
[1,     4,     2, 3]
[2,     1, 3, 4]
[2,     1,     3, 4]
[2,     3,     1, 4]
[2,     4,     1, 3]
[3,     1, 2, 4]
[3,     1,     2, 4]
[3,     2,     1, 4]
[3,     4,     1, 2]
[4,     1, 2, 3]
[4,     1,     2, 3]
[4,     2,     1, 3]
[4,     3,     1, 2]

---------------------------------------------------------

[1,     2, 3, 4]
[1,     2,     3, 4]
[1,     2,     3,     4]
[1,     2,     4,     3]
[1,     3,     2, 4]
[1,     3,     2,     4]
[1,     3,     4,     2]
[1,     4,     2, 3]
[1,     4,     2,     3]
[1,     4,     3,     2]


.........반복

static void permutation_Dic(int[] arr, int depth, int n, int k) {

if (depth == k) {

printArr(arr);
return;
}

for (int i = depth; i < n; i++) {

rightRotate(arr, depth, i);
permutation_Dic(arr, depth + 1, n, k);
leftRotate(arr, depth, i);
}
}

static void rightRotate(int[] arr, int start, int end) {

int last = arr[end];

for (int i = end; i > start; i--) {

arr[i] = arr[i - 1];
}

arr[start] = last;
}

static void leftRotate(int[] arr, int start, int end) {

int first = arr[start];

for (int i = start; i < end; i++) {

arr[i] = arr[i + 1];
}

arr[end] = first;
}

static void printArr(int[] arr) {

for (int i = 0; i < N; i++) {

System.out.print(arr[i] + " ");
}
System.out.println();
}


'Algorithm > 기타' 카테고리의 다른 글

NP, NP-Hard  (0) 2017.04.22
BOJ#1263 시간 관리  (0) 2017.04.17
알고리즘 용어  (0) 2017.04.03
Nim 게임  (0) 2017.04.03
n명을 k개의 그룹으로 분할하는 경우의 수 (제 2종 스털링 수)  (0) 2017.03.30