μ΄λ² κΈμμλ λͺ¨λ κ²½μ°μ μλ₯Ό νμνλ μμ νμ κΈ°λ²μμ μμ΄κ³Ό μ‘°ν© κ·Έλ¦¬κ³ λΆλΆμ§ν©μ λν ꡬν λ°©λ²μ μ 리ν΄λ³΄κ³ μ ν©λλ€.
μμ΄
μμ΄μ Nκ°μ μμ μ€μμ Rκ°μ μμλ₯Ό ν΅ν΄ μμλ₯Ό κ°μ§ λΆλΆμ§ν©μ λ§λλ κ²½μ°μ μμ λλ€. μμ΄μ μ¬κ· ν¨μλ₯Ό ν΅ν΄ λͺ¨λ κ²½μ°μ μλ₯Ό ꡬν μ μμ΅λλ€.
μ¬κ·ν¨μλ₯Ό μ¬μ©νκ² λλ©΄ μ΄λ² μμμ μμλ₯Ό μ¬μ©νλμ§ μ²΄ν¬νλ κ³Όμ μ΄ νμνλ°, μ΄ κ³Όμ μ boolean λ°°μ΄μ ν΅ν΄ 체ν¬νκ±°λ λΉνΈ λ§μ€νΉμ ν΅ν΄ ꡬνν μ μμ΅λλ€.
Boolean λ°°μ΄ μ¬μ©
permutationByBoolean(0);
static void permutationByBoolean(int cnt) {
if (cnt == N) {
printPermutation();
return;
}
for (int i = 0; i < arr.length; i++) {
if (check[i]) continue;
check[i] = true;
perm[cnt] = arr[i];
permutationByBoolean(cnt + 1);
check[i] = false;
}
}
λΉνΈ λ§μ€νΉ μ¬μ©
permutationByBitmasking(0, 0);
static void permutationByBitmasking(int cnt, int flag) {
if (cnt == N) {
printPermutation();
return;
}
for (int i = 0; i < arr.length; i++) {
if ((flag & 1 << i) > 0)
continue;
perm[cnt] = arr[i];
permutationByBitmasking(cnt + 1, flag | 1 << i);
}
}
λ§μ½ μ€λ¦μ°¨μμΌλ‘ μ λ ¬λ λ°°μ΄μμ μ¬μ μμΌλ‘ μμ΄μ ꡬνλ κ²½μ°μλ λ€μ μμμ μμ΄μ ꡬνλ λ°©λ²λ μ‘΄μ¬ν©λλ€. Python, C++μμλ Next Permutationμ΄λΌλ λΌμ΄λΈλ¬λ¦¬ ν¨μλ₯Ό ν΅ν΄ μ΄λ₯Ό μ 곡νμ§λ§ μλ°λ μ‘΄μ¬νμ§ μκΈ° λλ¬Έμ μ§μ ꡬνν΄ λ³Έ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
do {
System.out.println(Arrays.toString(arr));
} while(nextPermutation());
static boolean nextPermutation() {
int srcIdx = arr.length;
while(--srcIdx > 0) {
if (arr[srcIdx] > arr[srcIdx - 1]) break;
}
if (--srcIdx == -1)
return false;
int destIdx = arr.length;
while(--destIdx >= 0) {
if (arr[srcIdx] >= arr[destIdx]) continue;
swap(srcIdx, destIdx);
break;
}
}
destIdx = arr.length;
while (++srcIdx < --destIdx) {
swap(srcIdx, destIdx);
}
return true;
}
κ°λ¨νκ² κ³Όμ μ μ€λͺ νλ©΄ λ€μκ³Ό κ°μ΅λλ€.
1. 맨 λ€μμλΆν° νμμ μμν΄μ κ°μ΄ κ°μνλ μ§μ μ srcIdxλ‘ μ§μ
2. 맨 λ€μμλΆν° νμμ μμν΄μ srcIdxλ³΄λ€ κ°μ΄ 첫 λ²μ§Έ μμμ swap
3. srcIdx λ€μ μμλ₯Ό μ€λ¦μ°¨μμΌλ‘ μ λ ¬
μ‘°ν©
μ‘°ν©μ Nκ°μ μμ μ€μμ Rκ°μ μμλ₯Ό ν΅ν΄ λΆλΆμ§ν©μ λ§λλ κ²½μ°μ μμ λλ€. μμ΄κ³Ό λ€λ₯Έ μ μ μμμ μκ΄μμ΄ μ€λ³΅ μ¬λΆλ₯Ό λ°μ§κΈ° λλ¬Έμ 1,2,3 / 3,2,1κ³Ό κ°μ κ²½μ°λ μ‘°ν©μμλ κ°μ κ²½μ°κ° λ©λλ€. μ‘°ν©λ μ¬κ· ν¨μλ₯Ό ν΅ν΄ λͺ¨λ κ²½μ°μ μλ₯Ό ꡬν μ μμ§λ§ μμ΄κ³Ό λ€λ₯Έ μ μ μ¬κ· ν¨μ λ΄λΆμμ forλ₯Ό νΈμΆν νμμμ΄ λ€μ λ¨κ³λ‘ λμ΄κ°μ κ²μ¬λ₯Ό μ§νν©λλ€.
combination(0, 0);
static void combination(int idx, int cnt) {
if (cnt == N) {
printArray();
return;
}
if (idx == arr.length) return;
check[idx] = true;
combination(idx + 1, cnt + 1);
check[idx] = false;
combination(idx + 1, cnt);
}
boolean λ°°μ΄λ₯Ό ν΅ν΄ μ¬μ©μ¬λΆλ₯Ό 체ν¬νλ λ°©λ² μ΄μΈμλ μ§μ λ°°μ΄μ μ μ§νλ©΄μ λ½μ μ‘°ν©μ νμΈν μλ μμ΅λλ€.
combinationUsingList(0, new ArrayList<Integer>());
static void combinationUsingList(int idx, ArrayList<Integer> comb) {
if (comb.size() == N) {
comb.forEach(e -> System.out.print(e + " "));
System.out.println();
return;
}
if (idx == arr.length) return;
comb.add(arr[idx]);
combinationUsingList(idx + 1, comb);
comb.remove(Integer.valueOf(arr[idx]));
combinationUsingList(idx + 1, comb);
}
λν, μμ΄μ ꡬνλ ν λ°©λ²μΈ Next Permutationμ ν΅ν΄ μ‘°ν©μ ꡬν μ μμ΅λλ€.
flag = new int[5];
int idx = arr.length;
while (N-- > 0)
flag[--idx] = 1;
do {
printCombination();
} while (nextPermutation());
static boolean nextPermutation() {
int srcIdx = arr.length;
while (--srcIdx > 0) {
if (flag[srcIdx] > flag[srcIdx - 1])
break;
}
srcIdx -= 1;
if (srcIdx == -1)
return false;
int destIdx = arr.length;
while (--destIdx >= 0) {
if (flag[srcIdx] >= flag[destIdx])
continue;
swap(srcIdx, destIdx);
break;
}
destIdx = arr.length;
while (++srcIdx < --destIdx) {
swap(srcIdx, destIdx);
}
return true;
}
private static void printCombination() {
for (int i = 0; i < flag.length; i++) {
if (flag[i] == 0)
continue;
System.out.print(arr[i] + " ");
}
System.out.println();
}
κ³Όμ μ κ°λ¨ν μ€λͺ νλ©΄ λ€μκ³Ό κ°μ΅λλ€.
1. μ 체 μμ(N) λ§νΌ λ°°μ΄μ λ§λ€μ΄ 0μΌλ‘ μ΄κΈ°ν ν ν, λ½μ κ°μ(R) λ§νΌ λ€μμλΆν° 1λ‘ λ³κ²½
2. Next Permutationμ ν΅ν΄ μμ±λ λ°°μ΄μμ 1μ μμΉλ λ½μ μμμ μμΉμ λμΌ
λΆλΆ μ§ν©
λΆλΆ μ§ν©μ Nκ°μ μμλ₯Ό κ°μ§λ μ§ν©μμ μμλ₯Ό μ¬μ©ν΄ λ§λ€ μ μλ λͺ¨λ μ§ν©μ λνλ΄λ κ²½μ°μ μμ λλ€. λΆλΆ μ§ν©μ ꡬνλ λ°©λ²μ μ¬κ·λ₯Ό ν΅ν΄ ꡬννλ λ°©λ²κ³Ό nC1 ~ nCrμ ν΅ν΄ ꡬνλ λ°©λ²μ΄ μ‘΄μ¬ν©λλ€.
subset(0, 0);
private static void subset(int i, int cnt) {
if (i == 5) {
System.out.println(Arrays.toString(check));
return;
}
check[i] = true;
subset(i + 1, cnt + 1);
check[i] = false;
subset(i + 1, cnt);
}
μ‘°ν©κ³Ό λ€λ₯Έ μ μ μ‘°ν©μ Rκ°λ₯Ό λ½μ§ λͺ»ν κ²½μ°λ μ μΈνμμ§λ§ λΆλΆμ§ν©μ idxκ° λμ λλ¬νλ©΄ κ²½μ°μ μμ μΆκ°νλ€λ λΆλΆμ λλ€.
μ‘°ν©μ ν΅ν΄ ꡬν
private static void combination(int idx, int cnt, int R) {
if (cnt == R) {
System.out.println(Arrays.toString(check));
return;
}
if (idx == 5) return;
check[idx] = true;
combination(idx + 1, cnt + 1, R);
check[idx] = false;
combination(idx + 1, cnt, R);
}
'π Algorithm > π κ°λ μ 리' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[κ°λ μ 리] ν¬ ν¬μΈν° (0) | 2021.04.01 |
---|---|
[κ°λ μ 리] μ΅λ¨ 거리 μκ³ λ¦¬μ¦ - λ€μ΅μ€νΈλΌ (0) | 2021.03.22 |
[κ°λ μ 리] μ΅λ¨κ±°λ¦¬ μκ³ λ¦¬μ¦ - νλ‘μ΄λ μμ¬ (0) | 2021.03.16 |
[κ°λ μ 리] μ€μν μκ³ λ¦¬μ¦ (0) | 2021.02.26 |
λκΈ