1. μμ΄κ³Ό μ‘°ν©μ κΈ°λ³Έ κ°λ
μμ΄κ³Ό μ‘°ν©μ μνμ μΈ κ°λ μΌλ‘, μ£Όμ΄μ§ μμλ€μ μ‘°ν©νμ¬ λ€μν κ²½μ°λ₯Ό λ§λ€μ΄λ΄λ λ°©λ²μ μλ―Έν©λλ€. μμ΄μ μ£Όμ΄μ§ μμλ€μ μμλ₯Ό λ°κΏμ λ§λ€ μ μλ κ²½μ°μ μλ₯Ό λ§νλ©°, μ‘°ν©μ μμμ μκ΄μμ΄ μ£Όμ΄μ§ μμλ€μ λ½μ λ§λ€ μ μλ κ²½μ°μ μλ₯Ό λ§ν©λλ€.
μμ΄
μμλ€μ΄ μμλ₯Ό κ°μ§κ³ λ°°μ΄λλ κ²μ μμ΄μ΄λΌκ³ ν©λλ€. nκ°μ μμκ° μμ λ, μ΄λ€μ μΌλ ¬λ‘ λμ΄νλ κ²½μ°μ μλ n! (n ν©ν 리μΌ)μ λλ€. μλ₯Ό λ€μ΄, μμ A, B, Cμ μμ΄μ ABC, ACB, BAC, BCA, CAB, CBAμ 6κ°μ§ κ²½μ°κ° μμ΅λλ€. μμ΄μ μμμ μμμ λ°λΌ λ€λ₯Έ κ²½μ°λ₯Ό λ§λ€μ΄λ΄λ―λ‘, μμκ° μ€μν κ²½μ°μ μ£Όλ‘ νμ©λ©λλ€.
μ‘°ν©
μμλ€μ μμμ μκ΄μμ΄ μ ννμ¬ λ§λ€ μ μλ κ²½μ°μ μλ₯Ό μ‘°ν©μ΄λΌκ³ ν©λλ€. nκ°μ μμ μ€ rκ°λ₯Ό μ ννλ μ‘°ν©μ C(n, r) λλ nCrλ‘ νκΈ°ν©λλ€. μ‘°ν©μ μμμ μμμ μκ΄μμ΄ μ ννλ―λ‘, λμΌν μμλ€μ μ¬μ©νμ¬ λ§λ€μ΄μ§ κ²½μ°λ ν κ°μ§λ‘ μ·¨κΈλ©λλ€. μλ₯Ό λ€μ΄, μμ A, B, C μ€μμ 2κ°μ μμλ₯Ό μ ννμ¬ λ§λ€ μ μλ μ‘°ν©μ AB, AC, BCμ 3κ°μ§ κ²½μ°κ° μμ΅λλ€.
μμ΄κ³Ό μ‘°ν©μ λ€μν λ¬Έμ ν΄κ²°μ μ¬μ©λ μ μλ μ μ©ν κ°λ μΌλ‘, μ»΄ν¨ν° μκ³ λ¦¬μ¦μμλ λ리 νμ©λ©λλ€. λ€μ μ₯μμλ μμ΄κ³Ό μ‘°ν©μ ꡬν λ°©λ²μ λν΄ μμΈν μμ보λλ‘ νκ² μ΅λλ€.
2. μμ΄ μκ³ λ¦¬μ¦μ ꡬν
μ£Όμ΄μ§ μμμ μμ΄μ μμ±νλ μκ³ λ¦¬μ¦μ μ¬κ·μ μΈ λ°©λ²μ μ¬μ©νμ¬ κ΅¬νν μ μμ΅λλ€. μκ³ λ¦¬μ¦μ κΈ°λ³Έ μμ΄λμ΄λ λ€μκ³Ό κ°μ΅λλ€:
- μ£Όμ΄μ§ μμλ€ μ€ μ νλμ§ μμ μμλ₯Ό νλμ© μ νν©λλ€.
- μ νλ μμλ₯Ό κ²°κ³Όμ μΆκ°ν©λλ€.
- μ νλ μμλ₯Ό μ μΈν λλ¨Έμ§ μμλ€λ‘ μ¬κ· νΈμΆν©λλ€.
- μ¬κ· νΈμΆμ ν΅ν΄ μ»μ κ²°κ³Όμ μ νν μμλ₯Ό λΆμ¬μ μμ΄μ μμ±ν©λλ€.
- λͺ¨λ μμλ€μ΄ μ νλ λκΉμ§ λ°λ³΅ν©λλ€.
μλλ μ΄ μκ³ λ¦¬μ¦μ PythonμΌλ‘ ꡬνν μμμ λλ€:
def permutation(elements, result, depth):
# μ¬κ· νΈμΆ μ’
λ£ μ‘°κ±΄: λͺ¨λ μμκ° μ νλμ λ
if depth == len(elements):
print(result)
return
for i in range(len(elements)):
# μ΄λ―Έ μ νλ μμλ 건λλλλ€.
if elements[i] in result:
continue
# μμλ₯Ό μ ννκ³ μ¬κ· νΈμΆν©λλ€.
result.append(elements[i])
permutation(elements, result, depth + 1)
# μ νν μμλ₯Ό λ€μ μ κ±°ν©λλ€.
result.pop()
# μμ΄μ μμ±νκΈ° μν΄ νΈμΆν©λλ€.
elements = ['A', 'B', 'C']
permutation(elements, [], 0)
μμ μ½λλ₯Ό μ€ννλ©΄ μ£Όμ΄μ§ μμλ€μ λͺ¨λ μ¬μ©νμ¬ μμ±ν μ μλ μμ΄μ μΆλ ₯ν©λλ€. μλ₯Ό λ€μ΄, 3κ°μ μμ A, B, Cλ‘ μμ±ν μ μλ μμ΄μ ABC, ACB, BAC, BCA, CAB, CBAμ λλ€. μ΄ μκ³ λ¦¬μ¦μ μ¬κ· νΈμΆμ μ¬μ©νμ¬ λͺ¨λ κ²½μ°μ μλ₯Ό νμνλ―λ‘, μμμ κ°μμ λ°λΌ μκ° λ³΅μ‘λκ° μ¦κ°ν©λλ€. λ€μ μ₯μμλ μ‘°ν© μκ³ λ¦¬μ¦μ λν΄ μμ보λλ‘ νκ² μ΅λλ€.
3. μ‘°ν© μκ³ λ¦¬μ¦μ ꡬν
μ‘°ν© μκ³ λ¦¬μ¦μ μ£Όμ΄μ§ μμλ€ μ€μμ μΌλΆλ₯Ό μ ννμ¬ μ‘°ν©μ μμ±νλ μκ³ λ¦¬μ¦μ λλ€. μΌλ°μ μΌλ‘ μ¬κ·μ μΈ λ°©λ²μ μ¬μ©νμ¬ κ΅¬νν μ μμ΅λλ€. μκ³ λ¦¬μ¦μ κΈ°λ³Έ μμ΄λμ΄λ λ€μκ³Ό κ°μ΅λλ€:
- μ£Όμ΄μ§ μμλ€ μ€μμ μΌλΆλ₯Ό μ νν©λλ€.
- μ νλ μμλ₯Ό κ²°κ³Όμ μΆκ°ν©λλ€.
- μ νλ μμλ₯Ό μ μΈν λλ¨Έμ§ μμλ€λ‘ μ¬κ· νΈμΆν©λλ€.
- μ¬κ· νΈμΆμ ν΅ν΄ μ»μ κ²°κ³Όμ μ νν μμλ₯Ό λΆμ¬μ μ‘°ν©μ μμ±ν©λλ€.
- μ νλμ§ μμ μμλ€μ μΆκ°λ‘ μ ννλ©΄μ λͺ¨λ μ‘°ν©μ μμ±ν©λλ€.
μλλ μ΄ μκ³ λ¦¬μ¦μ PythonμΌλ‘ ꡬνν μμμ λλ€:
def combination(elements, result, depth, start):
# μ¬κ· νΈμΆ μ’
λ£ μ‘°κ±΄: λͺ¨λ μμκ° μ νλμ λ
if depth == len(result):
print(result)
return
for i in range(start, len(elements)):
# μμλ₯Ό μ ννκ³ μ¬κ· νΈμΆν©λλ€.
result[depth] = elements[i]
combination(elements, result, depth + 1, i + 1)
# μ‘°ν©μ μμ±νκΈ° μν΄ νΈμΆν©λλ€.
elements = ['A', 'B', 'C']
r = 2 # μ νν μμμ κ°μ
combination(elements, [None] * r, 0, 0)
μμ μ½λλ₯Ό μ€ννλ©΄ μ£Όμ΄μ§ μμλ€ μ€μμ rκ°λ₯Ό μ ννμ¬ μμ±ν μ μλ λͺ¨λ μ‘°ν©μ μΆλ ₯ν©λλ€. μλ₯Ό λ€μ΄, 3κ°μ μμ A, B, C μ€μμ 2κ°μ μμλ₯Ό μ ννμ¬ μμ±ν μ μλ μ‘°ν©μ AB, AC, BCμ λλ€. μ΄ μκ³ λ¦¬μ¦μ μ£Όμ΄μ§ μμλ€μ κ°μμ μ νν μμμ κ°μμ λ°λΌ μκ° λ³΅μ‘λκ° μ¦κ°ν©λλ€. μμ΄ μκ³ λ¦¬μ¦κ³Ό λ§μ°¬κ°μ§λ‘ μ¬κ· νΈμΆμ μ¬μ©νμ¬ λͺ¨λ κ²½μ°μ μλ₯Ό νμν©λλ€. μ΄λ κ² κ΅¬νλ μ‘°ν© μκ³ λ¦¬μ¦μ λ€μν λ¬Έμ ν΄κ²°μ μ μ©νκ² μ¬μ©λ μ μμ΅λλ€.
4. μμ΄κ³Ό μ‘°ν©μ μμ© μμ
μμ΄κ³Ό μ‘°ν©μ λ€μν λ¬Έμ ν΄κ²°μ μ μ©νκ² μ¬μ©λ μ μμ΅λλ€. μ΄μ μμ΄κ³Ό μ‘°ν©μ μμ© μμ λ₯Ό λͺ κ°μ§ μ΄ν΄λ³΄κ² μ΅λλ€.
4.1. λ‘λ λ²νΈ μμ±κΈ°
λ‘λ λ²νΈ μμ±κΈ°λ 1λΆν° 45κΉμ§μ μ«μ μ€μμ 6κ°μ μ«μλ₯Ό μ ννμ¬ λ‘λ λ²νΈλ₯Ό μμ±νλ λ¬Έμ μ λλ€. μ΄ λ¬Έμ λ μ‘°ν©μ μ¬μ©νμ¬ ν΄κ²°ν μ μμ΅λλ€. μλλ μ΄λ₯Ό ꡬνν μμμ λλ€:
def generate_lotto_numbers():
elements = list(range(1, 46))
r = 6
combination(elements, [None] * r, 0, 0)
μμ μ½λλ₯Ό μ€ννλ©΄ 1λΆν° 45κΉμ§μ μ«μ μ€μμ 6κ°μ μ«μλ₯Ό μ ννμ¬ μμ±ν μ μλ λͺ¨λ μ‘°ν©, μ¦ λ‘λ λ²νΈλ₯Ό μΆλ ₯ν©λλ€. μ΄λ₯Ό ν΅ν΄ λ‘λ λ²νΈ μμ±κΈ°λ₯Ό ꡬνν μ μμ΅λλ€.
4.2. μνΈ ν΄λ
μνΈ ν΄λ μ μ£Όμ΄μ§ μνΈλ₯Ό ν΄λ νμ¬ μλ¬Έμ μ°Ύλ λ¬Έμ μ λλ€. μνΈ ν΄λ μ μμ΄μ μ¬μ©νμ¬ κ΅¬νν μ μμ΅λλ€. μλλ μ΄λ₯Ό ꡬνν μμμ λλ€:
def decrypt_message(ciphertext, result, depth, used):
# μ¬κ· νΈμΆ μ’
λ£ μ‘°κ±΄: λͺ¨λ λ¬Έμκ° ν΄λ
λμ λ
if depth == len(result):
print(result)
return
for i in range(len(ciphertext)):
if not used[i]:
# λ¬Έμλ₯Ό ν΄λ
νκ³ μ¬κ· νΈμΆν©λλ€.
result[depth] = ciphertext[i]
used[i] = True
decrypt_message(ciphertext, result, depth + 1, used)
used[i] = False
μμ μ½λλ₯Ό μ€ννλ©΄ μ£Όμ΄μ§ μνΈλ₯Ό ν΄λ νμ¬ κ°λ₯ν λͺ¨λ μλ¬Έμ μΆλ ₯ν©λλ€. μ΄λ₯Ό ν΅ν΄ μνΈ ν΄λ μ ꡬνν μ μμ΅λλ€.
μμ΄κ³Ό μ‘°ν©μ μ΄μΈμλ λ§μ λ¬Έμ λ€μ ν΄κ²°νλ λ°μ μ μ©νκ² μ¬μ©λ μ μμ΅λλ€. μ΄λ κ² μμ΄κ³Ό μ‘°ν©μ μμ©νμ¬ λ¬Έμ λ₯Ό ν΄κ²°ν¨μΌλ‘μ¨, λ€μν μκ³ λ¦¬μ¦μ μ΅ν μ μκ³ λ¬Έμ ν΄κ²° λ₯λ ₯μ ν₯μμν¬ μ μμ΅λλ€.
5. μμ΄κ³Ό μ‘°ν© μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λ λΆμ
μμ΄κ³Ό μ‘°ν© μκ³ λ¦¬μ¦μ μμμ κ°μ nκ³Ό μ νν μμμ κ°μ rμ λ°λΌ μκ° λ³΅μ‘λκ° μ¦κ°ν©λλ€. μ΄μ κ° μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λλ₯Ό λΆμν΄λ³΄κ² μ΅λλ€.
5.1. μμ΄ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λ
μμ΄ μκ³ λ¦¬μ¦μ μ¬κ· νΈμΆμ μ¬μ©νμ¬ λͺ¨λ κ²½μ°μ μλ₯Ό νμν©λλ€. νμν΄μΌ νλ κ²½μ°μ μλ n!κ°μ΄λ©°, κ° νΈμΆλ§λ€ n-1, n-2, ..., 1λ²μ μ¬κ· νΈμΆμ΄ λ°μν©λλ€. λ°λΌμ μμ΄ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λλ O(n!)μ λλ€.
5.2. μ‘°ν© μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λ
μ‘°ν© μκ³ λ¦¬μ¦μ μμ΄ μκ³ λ¦¬μ¦κ³Ό λ§μ°¬κ°μ§λ‘ μ¬κ· νΈμΆμ μ¬μ©νμ¬ λͺ¨λ κ²½μ°μ μλ₯Ό νμν©λλ€. νμν΄μΌ νλ κ²½μ°μ μλ nCrκ°μ΄λ©°, κ° νΈμΆλ§λ€ r-1, r-2, ..., 1λ²μ μ¬κ· νΈμΆμ΄ λ°μν©λλ€. λ°λΌμ μ‘°ν© μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λλ O(nCr)μ λλ€.
μμ΄κ³Ό μ‘°ν© μκ³ λ¦¬μ¦μ κ²½μ°μ μλ₯Ό λͺ¨λ νμνκΈ° λλ¬Έμ μΌλΆ λ¬Έμ μμλ λΉν¨μ¨μ μΌ μ μμ΅λλ€. μλ₯Ό λ€μ΄, μμμ κ°μκ° λ§€μ° ν° κ²½μ° νμ μκ°μ΄ κΈκ²©ν μ¦κ°ν μ μμ΅λλ€. μ΄λ° κ²½μ°μλ λ€λ₯Έ μκ³ λ¦¬μ¦μ μ¬μ©νκ±°λ μ΅μ ν κΈ°λ²μ μ μ©νμ¬ ν¨μ¨μ μΈ ν΄κ²°μ± μ μ°ΎμμΌ ν©λλ€. λ°λΌμ λ¬Έμ μ 쑰건과 μ μ½μ κ³ λ €νμ¬ μλ§μ μκ³ λ¦¬μ¦μ μ ννλ κ²μ΄ μ€μν©λλ€.
λκΈ