import itertools

팩토리얼 : factorial

def factorial(x):
    n = 1
    for i in range(1,x+1):
        n = n*i 
    return n

factorial(6)

피보나치

def fibonacci(n):
    if n == 0:
        return 0
    if n == (1 or 2):
        return 1
    DP = [1, 1]
    for i in range(1, n - 1):
        DP.append(DP[i] + DP[i - 1])
    return DP[n - 1]

순열

list(itertools.permutations(["1","2","3","4"],2))
'''
경우의 수 : 12개
[('1', '2'),
 ('1', '3'),
 ('1', '4'),
 ('2', '1'),
 ('2', '3'),
 ('2', '4'),
 ('3', '1'),
 ('3', '2'),
 ('3', '4'),
 ('4', '1'),
 ('4', '2'),
 ('4', '3')]
'''

중복 순열

list(itertools.product((["1","2","3","4"]), repeat=2))
'''
경우의 수 : 16개
[('1', '1'),
 ('1', '2'),
 ('1', '3'),
 ('1', '4'),
 ('2', '1'),
 ('2', '2'),
 ('2', '3'),
 ('2', '4'),
 ('3', '1'),
 ('3', '2'),
 ('3', '3'),
 ('3', '4'),
 ('4', '1'),
 ('4', '2'),
 ('4', '3'),
 ('4', '4')]
'''

조합

list(itertools.combinations((["1","2","3","4"]),2))
'''
경우의 수 : 6개
[('1', '2'),
 ('1', '3'),
 ('1', '4'),
 ('2', '3'),
 ('2', '4'),
 ('3', '4')]
'''

중복 조합

list(itertools.combinations_with_replacement((["1","2","3","4"]),2))
'''
경우의 수 : 10개
[('1', '1'),
 ('1', '2'),
 ('1', '3'),
 ('1', '4'),
 ('2', '2'),
 ('2', '3'),
 ('2', '4'),
 ('3', '3'),
 ('3', '4'),
 ('4', '4')]
'''

리스트 병합

list1 = [1, 11, 111]
list2 = [2, 22, 222]
list3 = [3, 33, 333]
list(itertools.product(*[list1, list2, list3]))
'''
경우의수 : 27개
[(1, 2, 3),
 (1, 2, 33),
 (1, 2, 333),
 (1, 22, 3),
 (1, 22, 33),
 (1, 22, 333),
 (1, 222, 3),
 (1, 222, 33),
 (1, 222, 333),
 (11, 2, 3),
 (11, 2, 33),
 (11, 2, 333),
 (11, 22, 3),
 (11, 22, 33),
 (11, 22, 333),
 (11, 222, 3),
 (11, 222, 33),
 (11, 222, 333),
 (111, 2, 3),
 (111, 2, 33),
 (111, 2, 333),
 (111, 22, 3),
 (111, 22, 33),
 (111, 22, 333),
 (111, 222, 3),
 (111, 222, 33),
 (111, 222, 333)]
'''