μμ΄, μ‘°ν©, λΆλΆμ§ν© μ΄ μΈκ°μ§μ λν΄μ μ€μνκ² μκ°μ λͺ»νλλ°,
μ΄λ²μ λ°°μ보λ μ λ§ λ무λ무 μ€μν κ²λ€μ΄μ΄λ°..!!
μ΄κ²λ€μ 곡λΆνκ³ λλ λ¬Έμ μμλ λ€μνκ² νμ©ν μ μμ
κ·Έλμ μ€λμ κ·Έ μ€ μ²« λ²μ§Έλ‘ μμ΄μ ꡬννλ λ°©λ²μ λν΄ μ 리ν΄λ³΄λ €νλ€.
π μμ΄
μμ΄μ μλ‘ λ€λ₯Έ nκ°μ μμμμ rκ°λ₯Ό μμμ μκ΄μκ² μ ν νΉμ λμ΄νλ κ²μ λ§νλ€.
μλ₯Ό λ€μ΄ {1, 2, 3}μ λ°°μ΄μ΄ μλ€κ³ νλ©΄,
{1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, ... μ΄λ° μμΌλ‘ λμ΄λλ κ²!
μ¬κΈ°μ μ€μν μ μ {1, 2, 3}κ³Ό {3, 2, 1}μ΄ μλ‘ λ€λ₯΄λ€λ κ²μ΄λ€.
κΈ°λ³Έ μμ΄μ μ€λ³΅μ νμ©νμ§ μμ§λ§ μμλ₯Ό κ°μ§κΈ° λλ¬Έμ μμκ° λ€λ₯΄λ©΄ λ€λ₯Έ μμ΄λ‘ λ³Έλ€.
μ€λ³΅μ΄ μ‘΄μ¬νλ μμ΄λ μλλ°, μ΄λ μ€λ³΅ μμ΄μ΄λΌκ³ νλ€.
μ€λ³΅ μμ΄μ {1, 1, 1}, {1, 1, 2}, {1, 1, 3}, {1, 2, 1}, ... κ³Ό κ°μ΄ μ€λ³΅μ νμ©νλ€.
π μ 리νμλ©΄,
κΈ°λ³Έ μμ΄μ μ€λ³΅μ νμ©νμ§ μκ³ μμλ§ μκ³ ,
μ€λ³΅ μμ΄μ μ€λ³΅κ³Ό μμκ° λͺ¨λ μλ μμ΄!!
π κΈ°λ³Έ μμ΄ κ΅¬ν
public class Permutation1 {
static char[] src = { 'a', 'b', 'c', 'd' };
/*
* κΈ°λ³Έ μμ΄ - μ€λ³΅ X, μμ O
* @param nth - λͺ λ²μ§Έ μ νμΈμ§ νν
* @param choosed - μ νλ μμ
* @param visited - μ¬μ©λ μ μλ μμλ€ κΈ°λ‘
*/
static void makePermutation(int nth, char[] choosed, boolean[] visited) {
if(nth == choosed.length) { // κΈ°μ 쑰건: choosedλ₯Ό λ€ μ±μ λ€λ©΄ λ
System.out.println(Arrays.toString(choosed));
return;
}
for(int i = 0; i < src.length; i++) {
if(!visited[i]) {
visited[i] = true; // ν΄λΉ μμ μ νλμμμ κΈ°λ‘ (μ€λ³΅ λ°©μ§λ₯Ό μν¨)
choosed[nth] = src[i]; // ν΄λΉ μμ μ ννκΈ°
makePermutation(nth+1, choosed, visited); // λͺ λ²μ§Έ μ νμΈμ§ μΉ΄μ΄νΈ, μ νλ μμ trueλ‘ λ°λ visited ν¨κ» λ겨주기
visited[i] = false; // ν΄λΉ μμλ₯Ό λ€μ falseλ‘ λ°κΏμ£Όμ΄ λ€μ μμ΄μμλ μ¬μ©ν μ μκ² ν΄μ£ΌκΈ°
}
}
}
public static void main(String[] args) {
System.out.println("μμ΄");
makePermutation(0, new char[3], new boolean[src.length]); // srcμμ 3κ°λ₯Ό λ½μ λ§λ€ μ μλ μμ΄μ λͺ¨λ μΆλ ₯
}
}
nth νλΌλ―Έν°λ₯Ό μ΄μ©νμ¬ νμ¬μ μμ μ νμ΄ λͺ λ²μ§ΈμΈμ§λ₯Ό νννκ³ ,
choosedμλ νμ¬ μ νν μμλ₯Ό λ΄μμ μμ΄μ μμ±μν¬ μ μκ² νλ€.
visitedλ μ€λ³΅μ νΌνκΈ° μν΄ μ¬μ©νλ€.
π μ€λ³΅ μμ΄ κ΅¬ν
public class Permutation2 {
static char[] src = { 'a', 'b', 'c', 'd' };
/*
* μ€λ³΅ μμ΄ - μ€λ³΅ O, μμ O
* ex) abc aab --> μ€λ³΅ μμ΄
* κΈ°λ³Έ μμ΄μμ visitedλ§ λΉΌμ£Όλ©΄ ok
*
* @param nth - λͺ λ²μ§Έ μ νμΈμ§ νν
* @param choosed - μ νλ μμ
*/
static void makePermutationDup(int nth, char[] choosed) {
if(nth == choosed.length) { // κΈ°μ 쑰건: choosedλ₯Ό λ€ μ±μ λ€λ©΄ λ
System.out.println(Arrays.toString(choosed));
return;
}
for(int i = 0; i < src.length; i++) {
choosed[nth] = src[i]; // ν΄λΉ μμ μ ννκΈ°
makePermutationDup(nth+1, choosed); // visited κΈ°λ‘ νμ μμ΄, λͺ λ²μ§Έ μ νμΈμ§λ§ μΉ΄μ΄νΈ ν΄μ£Όλ©΄ ok
}
}
public static void main(String[] args) {
System.out.println("μμ΄");
makePermutationDup(0, new char[3]); // srcμμ 3κ°λ₯Ό λ½μ λ§λ€ μ μλ μ€λ³΅ μμ΄μ λͺ¨λ μΆλ ₯
}
}
μ€λ³΅ μμ΄μ κΈ°λ³Έ μμ΄κ³Ό κ±°μ λμΌνλ°,
μ€λ³΅μ νμ©νλ―λ‘ visited λ°°μ΄λ§ λΉΌμ£Όμλ€.
π μ 리
μμ΄μ μ€λ³΅ μμ΄ μμλ€μ λ½μ λμ΄ν κ²μ μλ―Ένκ³ ,
μ€λ³΅ μμ΄μ μ€λ³΅μ νμ©νμ¬ μμλ€μ λ½μ λμ΄ν κ²μ λ§ν¨
μμ΄κ³Ό μ€λ³΅ μμ΄μ λͺ¨λ μ¬κ· λ°©μμΌλ‘ κ°λ¨ν ꡬνν μ μλλ°,
μμ΄ κ΅¬ν λ©μλμμ visited λ°°μ΄λ§ μ κ±°ν΄μ£Όλ©΄ μ€λ³΅ μμ΄μ΄ λλ€.
'5οΈβ£ CS > Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java Algorithm Note] λΆλΆμ§ν© (feat. μ¬κ·) (0) | 2022.08.16 |
---|---|
[Java Algorithm Note] μ‘°ν© (feat. μ¬κ·) (0) | 2022.08.15 |
[Swift Algorithm Note] μ΅μ₯ μ¦κ° λΆλΆ μμ΄ 2 (feat. BS) (0) | 2021.08.29 |
[Swift Algorithm Note] μ΅μ₯ μ¦κ° λΆλΆ μμ΄ (feat. DP) (0) | 2021.08.28 |
[Swift Algorithm Note] λμ κ³νλ² (feat. Fibonacci) (0) | 2021.08.28 |
λκΈ